/ Hex Artifact Content
Login

Artifact 8022201b3008c9ff151cf56cf2c36a0db93689fd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = -1;.}../*.** 
4ef0: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
4f00: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4f10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
4f20: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
4f30: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
4f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4f50: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
4f60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f70: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
4f80: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
4f90: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
4fa0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
4fb0: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
4fc0: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
4fd0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4fe0: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
4ff0: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5000: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5010: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5020: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5030: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5040: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5050: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
5060: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
5070: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
5080: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
5090: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
50a0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
50b0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
50c0: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
50d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
50e0: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
50f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5100: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5110: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5120: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5130: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5150: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
5160: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5180: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5190: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
51a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
51b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
51c0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
51d0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
51e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5200: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5210: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
5230: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
5240: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
5250: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
5260: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
5270: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
5280: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
5290: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
52a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
52b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
52c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
52d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
52e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
52f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
5300: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
5310: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
5320: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
5330: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
5340: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
5350: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
5360: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
5370: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
5380: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
5390: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
53a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
53b0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
53c0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
53d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
53e0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
53f0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5400: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5430: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5460: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5470: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5480: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
54a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
54b0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
54c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
54d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
54e0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
54f0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5510: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5520: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5530: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5540: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5550: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5560: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5570: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5580: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
5590: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
55a0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
55b0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
55c0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
55d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
55f0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5620: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5630: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5640: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5650: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5660: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5670: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5680: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5690: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
56a0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
56b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
56d0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5700: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5710: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5720: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5750: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5760: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5770: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5780: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5790: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  EEK;.  }..  pCur
57a0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
57b0: 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
57c0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
57d0: 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65  CF_AtLast);.  re
57e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
57f0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5800: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
5810: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5820: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5830: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
5840: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
5850: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
5860: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
5870: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
5880: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
5890: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
58a0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
58b0: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
58c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
58d0: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
58e0: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
58f0: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
5900: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
5910: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
5920: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
5930: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
5940: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
5950: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
5960: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
5970: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
5980: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5990: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
59a0: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
59b0: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
59c0: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
59d0: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
59e0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
59f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
5a00: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
5a10: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
5a20: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
5a30: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
5a40: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
5a50: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
5a60: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
5a70: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
5a80: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
5a90: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
5aa0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5ab0: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
5ac0: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
5ad0: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
5ae0: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
5af0: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5b00: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
5b10: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
5b20: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
5b30: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
5b40: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
5b50: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
5b60: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
5b70: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
5b80: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
5b90: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
5ba0: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
5bb0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
5bc0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
5bd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
5be0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
5bf0: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
5c00: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
5c10: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
5c20: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
5c30: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
5c40: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
5c50: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
5c60: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
5c70: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
5c80: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
5c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5ca0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
5cb0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5cc0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
5cd0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
5ce0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
5cf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5d00: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
5d10: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
5d20: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
5d30: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
5d40: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
5d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5d70: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
5d80: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
5d90: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
5da0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
5db0: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
5dc0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5dd0: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
5de0: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
5df0: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
5e00: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
5e10: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
5e20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5e30: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
5e40: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
5e50: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
5e60: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
5e70: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
5e80: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
5e90: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
5ea0: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
5eb0: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
5ec0: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
5ed0: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
5ee0: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
5ef0: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
5f00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5f10: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
5f20: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
5f30: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
5f40: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
5f50: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
5f60: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5f70: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5f80: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
5f90: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
5fa0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
5fb0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
5fc0: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
5fd0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
5fe0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
5ff0: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6000: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6010: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6020: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6030: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6040: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6050: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6060: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6070: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6080: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6090: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
60a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
60b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
60c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
60d0: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
60e0: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
60f0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6100: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6110: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6150: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6160: 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  age>0 );.       
6170: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6180: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
6190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
61a0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
61b0: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
61c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
61d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
61e0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
61f0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6210: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6220: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6230: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6240: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6250: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6260: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6270: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6280: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
6290: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62a0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
62b0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
62c0: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
62d0: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
62e0: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
62f0: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
6300: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
6310: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
6320: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
6330: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
6340: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
6350: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
6360: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
6370: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
6380: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
6390: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
63a0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
63b0: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
63c0: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
63d0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
63e0: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
63f0: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
6400: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
6410: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
6420: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
6430: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
6440: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
6450: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
6460: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
6470: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
6480: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
6490: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
64a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
64b0: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
64c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
64f0: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
6500: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
6510: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
6520: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
6530: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
6550: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
6560: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
6570: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
6580: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
6590: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
65a0: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
65b0: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
65c0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
65d0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
65e0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
65f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6600: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
6610: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
6620: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
6630: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
6640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6650: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
6660: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6670: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6680: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6690: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
66a0: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
66b0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
66c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
66d0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
66e0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
66f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6700: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6710: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6720: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6740: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6750: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6760: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6770: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6790: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
67a0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
67b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
67c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
67d0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
67e0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
67f0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
6800: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6810: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6820: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6830: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6840: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6850: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6860: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6870: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6880: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6890: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
68a0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
68b0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
68c0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
68d0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
68e0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
68f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6910: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6920: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6930: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6940: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6950: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6960: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6970: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
6980: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6990: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
69a0: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
69b0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
69c0: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
69d0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
69e0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
69f0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6a00: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
6a10: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
6a20: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
6a30: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
6a40: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
6a50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6a60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6a70: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6a80: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
6a90: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
6aa0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ab0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6ac0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6ad0: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
6ae0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
6af0: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
6b00: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
6b10: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
6b20: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b30: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
6b40: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6b50: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6b60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6b70: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6b80: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6b90: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6ba0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6bb0: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6bc0: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6bd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6be0: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
6bf0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
6c00: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
6c10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
6c20: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6c30: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
6c40: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
6c50: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
6c60: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
6c70: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
6c80: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
6c90: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6ca0: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6cb0: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6cc0: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6cd0: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
6ce0: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
6cf0: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
6d00: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
6d10: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
6d20: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
6d30: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6d40: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
6d50: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
6d60: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
6d70: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
6d80: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
6d90: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
6da0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
6db0: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
6dc0: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
6dd0: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
6de0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6df0: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
6e00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
6e10: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
6e20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6e30: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
6e40: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6e50: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
6e60: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
6e70: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
6e80: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
6e90: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
6ea0: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
6eb0: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
6ec0: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
6ed0: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
6ee0: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
6ef0: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
6f00: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
6f10: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
6f20: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
6f30: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
6f40: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
6f50: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
6f60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
6f70: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
6f80: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
6f90: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
6fa0: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
6fb0: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
6fc0: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
6fd0: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
6fe0: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
6ff0: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
7000: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
7010: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
7020: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
7030: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
7040: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
7050: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7060: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7070: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7080: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
70a0: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
70b0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
70c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
70d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
70e0: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
70f0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7100: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7110: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
7120: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7130: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
7140: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
7150: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7160: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7170: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7180: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7190: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
71a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
71b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
71c0: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
71d0: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
71e0: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
71f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7210: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7220: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7230: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7240: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7250: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7260: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7270: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7280: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7290: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
72a0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
72b0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
72c0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
72d0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
72e0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
72f0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7300: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7310: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7320: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7330: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
7340: 61 5f 73 74 61 72 74 28 61 70 2c 20 65 48 69 6e  a_start(ap, eHin
7350: 74 54 79 70 65 29 3b 0a 23 69 66 64 65 66 20 53  tType);.#ifdef S
7360: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
7370: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 69 66 28 20  SOR_HINTS.  if( 
7380: 65 48 69 6e 74 54 79 70 65 3d 3d 42 54 52 45 45  eHintType==BTREE
7390: 5f 48 49 4e 54 5f 46 4c 41 47 53 20 29 0a 23 65  _HINT_FLAGS ).#e
73a0: 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 65 48  lse.  assert( eH
73b0: 69 6e 74 54 79 70 65 3d 3d 42 54 52 45 45 5f 48  intType==BTREE_H
73c0: 49 4e 54 5f 46 4c 41 47 53 20 29 3b 0a 23 65 6e  INT_FLAGS );.#en
73d0: 64 69 66 0a 20 20 7b 0a 20 20 20 20 70 43 75 72  dif.  {.    pCur
73e0: 2d 3e 68 69 6e 74 73 20 3d 20 76 61 5f 61 72 67  ->hints = va_arg
73f0: 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
7400: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
7410: 70 43 75 72 2d 3e 68 69 6e 74 73 3d 3d 42 54 52  pCur->hints==BTR
7420: 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 70 43  EE_SEEK_EQ || pC
7430: 75 72 2d 3e 68 69 6e 74 73 3d 3d 42 54 52 45 45  ur->hints==BTREE
7440: 5f 42 55 4c 4b 4c 4f 41 44 0a 20 20 20 20 20 20  _BULKLOAD.      
7450: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
7460: 72 2d 3e 68 69 6e 74 73 3d 3d 30 20 29 3b 0a 20  r->hints==0 );. 
7470: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
7480: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7490: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
74a0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
74b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
74c0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
74d0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
74e0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
74f0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
7500: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
7510: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
7520: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
7530: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
7540: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
7550: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
7560: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
7570: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
7580: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
7590: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
75a0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
75b0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
75c0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
75d0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
75e0: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
75f0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
7600: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7610: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
7620: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7630: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
7640: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
7650: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7660: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7670: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
7680: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
7690: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
76a0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
76b0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
76c0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
76d0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
76e0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
76f0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7700: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7710: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
7720: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7730: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
7740: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
7750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
7760: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7770: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7780: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7790: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
77a0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
77b0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
77c0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
77d0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
77e0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
77f0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7800: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
7810: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7820: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7830: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
7840: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7850: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
7860: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7870: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
7880: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
7890: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
78a0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
78b0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
78c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
78d0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
78e0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
78f0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7900: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7910: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7920: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7930: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7940: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7950: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7960: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7970: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7980: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7990: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
79a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
79b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
79c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
79d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
79e0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
79f0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7a00: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7a10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7a20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7a30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7a40: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7a50: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7a60: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7a70: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7a80: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7a90: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7aa0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7ab0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7ac0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7ad0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7ae0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7af0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7b00: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7b10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7b20: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7b30: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7b40: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7b50: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7b60: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7b70: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7b80: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
7b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ba0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7bb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7bc0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7bd0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7be0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7bf0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7c00: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7c10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7c20: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7c30: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7c40: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7c50: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7c60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7c70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7c80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7c90: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7ca0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7cb0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7cc0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7cd0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7ce0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7cf0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7d00: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7d10: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7d20: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7d30: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7d40: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7d60: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7d70: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7d80: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7d90: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7da0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7db0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7dc0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7dd0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7de0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7df0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7e00: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7e10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7e20: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7e30: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7e40: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7e50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7e60: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7e70: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7e80: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7e90: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
7ea0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7eb0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7ec0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7ed0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7ee0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7ef0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7f00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7f10: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7f20: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7f30: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7f40: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7f50: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7f60: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7f70: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7f80: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7f90: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
7fa0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
7fb0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
7fc0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
7fd0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7fe0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7ff0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8000: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8020: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8030: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8040: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8050: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8060: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8070: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8080: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8090: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
80a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
80b0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
80c0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
80d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
80e0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
80f0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8100: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8110: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8120: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8130: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8140: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8150: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8160: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8170: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8180: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8190: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
81a0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
81b0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
81c0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
81d0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
81e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
81f0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8200: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8210: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8220: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8230: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8250: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
8260: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8270: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
8280: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
8290: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
82a0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
82b0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
82c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
82d0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
82e0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
82f0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8300: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
8310: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
8320: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8330: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
8340: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
8350: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
8360: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
8370: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
8380: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
8390: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
83a0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
83b0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
83c0: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
83d0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
83e0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
83f0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
8400: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
8410: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
8420: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
8430: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
8440: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8450: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
8460: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
8470: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
8480: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
8490: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
84a0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
84b0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
84c0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
84d0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
84e0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
84f0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8500: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
8510: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
8520: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
8530: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
8540: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
8550: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
8560: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
8570: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
8580: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
8590: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
85a0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
85b0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
85c0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
85d0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
85e0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
85f0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
8600: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
8610: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
8620: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
8630: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
8640: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8650: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
8660: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8670: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
8680: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
8690: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
86a0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
86b0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
86c0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
86e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
86f0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8700: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8710: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8720: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8730: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
8740: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8750: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8760: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8770: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
8780: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
8790: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
87a0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
87b0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
87c0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
87d0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
87e0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
87f0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8800: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
8810: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
8820: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
8830: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
8840: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
8850: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
8860: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
8870: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
8880: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
8890: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
88a0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
88b0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
88c0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
88d0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
88e0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
88f0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
8900: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8910: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8920: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8930: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
8940: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
8950: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
8960: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
8970: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
8980: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
8990: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
89a0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
89b0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
89c0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
89d0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
89e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
89f0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
8a00: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
8a10: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
8a20: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
8a30: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8a40: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
8a50: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8a60: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
8a70: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8a80: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8a90: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8aa0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8ab0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8ac0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8ad0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8ae0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8af0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
8b00: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
8b10: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
8b20: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
8b30: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  cal] - pCell);. 
8b40: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8b50: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8b60: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
8b70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
8b80: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
8b90: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8ba0: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8bb0: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8bc0: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8bd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8be0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8bf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
8c00: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
8c10: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8c20: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
8c30: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
8c40: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8c50: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8c60: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8c70: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8c80: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8c90: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8ca0: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8cb0: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8cc0: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8cd0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8ce0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8cf0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
8d00: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
8d10: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
8d20: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
8d30: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
8d40: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
8d50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8d60: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8d70: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8d80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8d90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8da0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8db0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8dc0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8dd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8de0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8df0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8e00: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8e10: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8e20: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8e30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8e40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8e60: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
8e70: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
8e80: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
8e90: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
8ea0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
8eb0: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e  rSize==4 );.#ifn
8ec0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8ed0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8ee0: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
8ef0: 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  if.  pInfo->nSiz
8f00: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8f10: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8f20: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8f30: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
8f40: 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  oad = 0;.  pInfo
8f50: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  ->nLocal = 0;.  
8f60: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8f70: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70   = 0;.  pInfo->p
8f80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72  Payload = 0;.  r
8f90: 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  eturn;.}.static 
8fa0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8fb0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
8fc0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8fd0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8fe0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
8ff0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9010: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
9020: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
9030: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9040: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9050: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9060: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
9070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9080: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
9090: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
90a0: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
90b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
90c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
90d0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
90e0: 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20    u64 iKey;     
90f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
9100: 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65  racted Key value
9110: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
9120: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9130: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9140: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9150: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
9160: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
9170: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
9180: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
9190: 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61  f || pPage->noPa
91a0: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
91b0: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
91c0: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  oad==0 );.  asse
91d0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
91e0: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
91f0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9200: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9210: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9220: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9230: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9240: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9250: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9260: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
9270: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
9280: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9290: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
92a0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
92b0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
92c0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
92d0: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
92e0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
92f0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9300: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9310: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9320: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9330: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9340: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9350: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9360: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9370: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9380: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9390: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
93a0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
93b0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
93c0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
93d0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
93e0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
93f0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9400: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9410: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9420: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9430: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
9440: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
9450: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9460: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9470: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9480: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9490: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
94a0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
94b0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
94c0: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
94d0: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
94e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
94f0: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9500: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9510: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9520: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9530: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9540: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
9550: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9560: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9570: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9580: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9590: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
95a0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
95b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
95d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
95e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
95f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
9600: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
9610: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9620: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
9630: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
9640: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
9650: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
9660: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
9670: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
9680: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
9690: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
96a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
96b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
96c0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
96d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
96e0: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
96f0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
9700: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9710: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
9720: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
9730: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65  erflow = 0;.  }e
9740: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9750: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9760: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9770: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9780: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9790: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
97a0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
97b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
97c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
97d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
97e0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
97f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9800: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9810: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9820: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9830: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9840: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9850: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9860: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9870: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9880: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9890: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
98a0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
98b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
98c0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
98d0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
98e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
98f0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9900: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9910: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9920: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9930: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
9940: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
9950: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
9960: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
9970: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  oad==0 );.  pIte
9980: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9990: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
99a0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
99b0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
99c0: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
99d0: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
99e0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
99f0: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9a00: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9a10: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9a20: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9a30: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9a40: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9a50: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9a60: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9a70: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
9a80: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
9a90: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9aa0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9ab0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9ac0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9ad0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9ae0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9af0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9b00: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9b10: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9b20: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9b30: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9b40: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9b50: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9b60: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9b70: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9b80: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9b90: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9ba0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9bb0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9bc0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9bd0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9be0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9bf0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9c00: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9c10: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9c20: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9c30: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9c40: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
9c50: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
9c60: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9c70: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9c80: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9c90: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9ca0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9cb0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9cc0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9cd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9ce0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9cf0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
9d00: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9d10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9d20: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9d30: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9d40: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9d50: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9d60: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9d70: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
9d80: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
9d90: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
9da0: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
9db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9dc0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9dd0: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9de0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9df0: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
9e00: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
9e10: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
9e20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
9e30: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
9e40: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
9e50: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
9e60: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
9e70: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
9e80: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
9e90: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
9ea0: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
9eb0: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
9ec0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
9ed0: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
9ee0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
9ef0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9f00: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
9f10: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
9f20: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
9f30: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
9f40: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
9f50: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
9f60: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
9f70: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
9f80: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
9f90: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
9fa0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9fb0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9fc0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
9fd0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
9fe0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9ff0: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a000: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
a040: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
a050: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
a080: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
a090: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a0a0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a0b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a0c0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a0d0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a0e0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a0f0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a100: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a110: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a120: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a130: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a140: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a150: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a160: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a170: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a180: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a190: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a1a0: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a1b0: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a1c0: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a1d0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a1e0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a1f0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
a200: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
a210: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
a220: 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20  =0 );.  nSize = 
a230: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
a240: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
a250: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
a260: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
a270: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a280: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
a290: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
a2a0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
a2b0: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
a2c0: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
a2d0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
a2e0: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
a2f0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
a300: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
a310: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
a320: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
a330: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
a340: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
a350: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a360: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a370: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a380: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a390: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a3a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a3b0: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a3c0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a3d0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a3e0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a3f0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a400: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a410: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a420: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a430: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a440: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a450: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a460: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a470: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a480: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a490: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a4a0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a4c0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a4d0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a500: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a510: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a520: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a530: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a540: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a550: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a560: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a570: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a580: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a590: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a5a0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a5b0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a5c0: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a5d0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a5e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a5f0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a600: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a610: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a620: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a630: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a640: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a650: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a660: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a670: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a680: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a690: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a6a0: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a6b0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a6c0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a6d0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a6e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a6f0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a700: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a710: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a720: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a730: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a740: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a750: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a760: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a770: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a780: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a790: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a7a0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a7b0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a7c0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a7d0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a7e0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a7f0: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a800: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a810: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a820: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a830: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a840: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a850: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a860: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a880: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a890: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a8a0: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a8b0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a8c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a8d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a8e0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a8f0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a900: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a910: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a920: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a930: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a940: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a950: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a960: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
a970: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
a980: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
a990: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
a9a0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
a9b0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
a9c0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
a9d0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
a9e0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
a9f0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
aa00: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
aa10: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
aa20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
aa30: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
aa40: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
aa50: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
aa60: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
aa70: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
aa80: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
aa90: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
aaa0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
aab0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
aac0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
aad0: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
aae0: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
aaf0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
ab00: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
ab10: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
ab20: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
ab30: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
ab40: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
ab50: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
ab60: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
ab70: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
ab80: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
ab90: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
aba0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
abb0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
abc0: 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50      ptrmapPut(pP
abd0: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
abe0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
abf0: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
ac00: 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  RC);.  }.}.#endi
ac10: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
ac20: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
ac30: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
ac40: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
ac50: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
ac60: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
ac70: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
ac80: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
ac90: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
aca0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
acb0: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
acc0: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
acd0: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
ace0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
acf0: 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  a..**.** EVIDENC
ad00: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
ad10: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
ad20: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
ad30: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
ad40: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
ad50: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
ad60: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
ad70: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
ad80: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
ad90: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
ada0: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
adb0: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
adc0: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
add0: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
ade0: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
adf0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
ae00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
ae10: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
ae20: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
ae30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ae40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ae50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
ae60: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
ae70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ae80: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
ae90: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
aea0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
aeb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
aec0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
aed0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
aee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aef0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
af00: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
af10: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
af20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
af30: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
af40: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
af50: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
af60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
af70: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
af80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
af90: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afb0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
afc0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
afd0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
b000: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
b010: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b020: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
b030: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
b040: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b050: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
b060: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
b070: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
b080: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b090: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
b0a0: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
b0b0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
b0c0: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
b0d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
b0e0: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
b0f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
b100: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
b110: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b120: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
b130: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b140: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b150: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b160: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b170: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b190: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b1a0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
b1b0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
b1c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
b1d0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
b1e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b1f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b200: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b210: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
b220: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
b230: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
b240: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b250: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
b260: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
b270: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
b280: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
b290: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
b2a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b2b0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
b2c0: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
b2d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
b2e0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
b2f0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
b300: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b310: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
b320: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
b330: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
b340: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
b350: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
b360: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
b370: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
b380: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
b390: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
b3a0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
b3b0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
b3c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b3d0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b3e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b3f0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b400: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
b410: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
b420: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
b430: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
b440: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
b450: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
b460: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
b470: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
b480: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
b490: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
b4a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b4b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b4c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
b4d0: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
b4e0: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
b4f0: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
b500: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b510: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
b520: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
b530: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
b540: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
b550: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
b560: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b570: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b580: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
b590: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
b5a0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
b5b0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b5c0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b5d0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
b5e0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
b5f0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
b600: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b610: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
b620: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
b630: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
b640: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
b650: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
b660: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b670: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
b680: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
b690: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
b6a0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
b6b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b6c0: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
b6d0: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
b6e0: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
b6f0: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
b700: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
b710: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
b720: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
b730: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73   size);.  }.  as
b740: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
b750: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
b760: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b770: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
b780: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
b790: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
b7a0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
b7b0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
b7c0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
b7d0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
b7e0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
b7f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b800: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b810: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
b820: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
b830: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
b840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b850: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b860: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b870: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b880: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
b890: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
b8a0: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
b8b0: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
b8c0: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
b8d0: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
b8e0: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
b8f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b900: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
b910: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
b920: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
b930: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
b940: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
b950: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
b960: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
b970: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
b980: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
b990: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
b9a0: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
b9b0: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
b9c0: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
b9d0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b9e0: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
b9f0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
ba00: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
ba10: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
ba20: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
ba30: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
ba40: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
ba50: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
ba60: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
ba70: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
ba80: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
ba90: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
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 20 74 6f 20 65 78 63 65 65  n count to excee
bac0: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
bad0: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
bae0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
baf0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
bb00: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
bb10: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
bb20: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
bb30: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
bb40: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
bb50: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
bb60: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
bb70: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
bb80: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
bb90: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
bba0: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
bbb0: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
bbc0: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
bbd0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
bbe0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bbf0: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
bc00: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
bc10: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
bc20: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
bc30: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
bc40: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
bc50: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
bc60: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
bc70: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
bc80: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
bc90: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
bca0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
bcb0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
bcc0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
bcd0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bce0: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
bcf0: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
bd00: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
bd10: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
bd20: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
bd30: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
bd40: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
bd50: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
bd60: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
bd70: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
bd80: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
bd90: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
bda0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bdb0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
bdc0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
bdd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
bde0: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
bdf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
be00: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
be10: 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f   pc < pPg->cellO
be20: 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65  ffset+2*pPg->nCe
be30: 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20  ll || size+pc > 
be40: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
be50: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
be60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be70: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
be80: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
be90: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
bea0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
beb0: 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32  F: R-11498-58022
bec0: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
bed0: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
bee0: 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  he total.       
bef0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79   ** number of by
bf00: 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73  tes in fragments
bf10: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
bf20: 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  60. */.        i
bf30: 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e  f( aData[hdr+7]>
bf40: 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  57 ) return 0;..
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
bf60: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
bf70: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
bf80: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
bf90: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
bfa0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
bfb0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
bfc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
bfd0: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
bfe0: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
bff0: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
c000: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
c010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
c030: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
c040: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
c050: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
c060: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
c070: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
c080: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
c090: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
c0a0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
c0b0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
c0c0: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
c0d0: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
c0e0: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
c0f0: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
c100: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
c110: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
c120: 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a   }while( pc );..
c130: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c140: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
c150: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
c160: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
c170: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
c180: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
c190: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
c1a0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
c1b0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
c1c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
c1d0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
c1e0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
c1f0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
c200: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
c210: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
c220: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
c230: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
c240: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
c250: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
c260: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
c270: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
c280: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
c290: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
c2a0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
c2b0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
c2c0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
c2d0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
c2e0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
c2f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
c300: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
c310: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
c320: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
c330: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
c340: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
c350: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
c360: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
c370: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
c380: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
c390: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
c3a0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
c3b0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
c3c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
c3d0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
c3e0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
c3f0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
c400: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
c410: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
c420: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
c430: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
c440: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
c450: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
c460: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
c470: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
c480: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c490: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
c4a0: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c4d0: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
c4e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c4f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c500: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
c510: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
c520: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
c530: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
c540: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c550: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
c560: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
c570: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
c580: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
c590: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c5a0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c5b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c5c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
c5d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c5f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c600: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c610: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
c620: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
c630: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
c640: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
c650: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
c660: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
c670: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
c680: 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74  rt( nByte < (int
c690: 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  )(pPage->pBt->us
c6a0: 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a  ableSize-8) );..
c6b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c6c0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
c6d0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c6e0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
c6f0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c700: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
c710: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
c720: 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20   gap<=65536 );. 
c730: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c740: 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49   R-29356-02391 I
c750: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  f the database u
c760: 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65  ses a 65536-byte
c770: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20   page size.  ** 
c780: 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64  and the reserved
c790: 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28   space is zero (
c7a0: 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20  the usual value 
c7b0: 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61  for reserved spa
c7c0: 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ce).  ** then th
c7d0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  e cell content o
c7e0: 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74  ffset of an empt
c7f0: 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20  y page wants to 
c800: 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48  be 65536..  ** H
c810: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74  owever, that int
c820: 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67  eger is too larg
c830: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  e to be stored i
c840: 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67  n a 2-byte unsig
c850: 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ned.  ** integer
c860: 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  , so a value of 
c870: 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73  0 is used in its
c880: 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70   place. */.  top
c890: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c8a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73  a[hdr+5]);.  ass
c8b0: 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70  ert( top<=(int)p
c8c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c8d0: 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76  eSize ); /* Prev
c8e0: 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69  ent by getAndIni
c8f0: 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28  tPage() */.  if(
c900: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
c910: 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50  if( top==0 && pP
c920: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
c930: 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20  Size==65536 ){. 
c940: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
c950: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c960: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c970: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c980: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
c990: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
c9a0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
c9b0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
c9c0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
c9d0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
c9e0: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
c9f0: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
ca00: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
ca10: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
ca20: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
ca30: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
ca40: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
ca50: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
ca60: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
ca70: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
ca80: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
ca90: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
caa0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
cab0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
cac0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
cad0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
cae0: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
caf0: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
cb00: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
cb10: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
cb20: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
cb30: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cb40: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
cb50: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
cb60: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
cb70: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
cb80: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
cb90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cba0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
cbb0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cbc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
cbd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
cbe0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
cbf0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
cc00: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
cc10: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
cc20: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
cc30: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
cc40: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
cc50: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
cc60: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
cc70: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
cc80: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
cc90: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
cca0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
ccb0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
ccc0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
ccd0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
cce0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
ccf0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
cd00: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
cd10: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
cd20: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
cd30: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
cd40: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
cd50: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
cd60: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
cd70: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
cd80: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
cd90: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
cda0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cdb0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
cdc0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
cdd0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
cde0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
cdf0: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
ce00: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
ce10: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
ce20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
ce30: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
ce40: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
ce50: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
ce60: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
ce70: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
ce80: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
ce90: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
cea0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ceb0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
cec0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
ced0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
cee0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
cef0: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
cf00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cf10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cf20: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
cf30: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
cf40: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
cf50: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
cf60: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
cf70: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
cf80: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
cf90: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
cfa0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
cfb0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
cfc0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
cfd0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
cfe0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
cff0: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
d000: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
d010: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
d020: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
d030: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
d040: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
d050: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
d060: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
d070: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
d080: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
d090: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
d0a0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
d0b0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
d0c0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
d0d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d0e0: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
d0f0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
d100: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
d110: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
d120: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
d130: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
d140: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
d150: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
d160: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
d170: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
d180: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
d190: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
d1a0: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
d1d0: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
d1e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
d1f0: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
d220: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
d230: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d260: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
d270: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
d280: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
d2b0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
d2c0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
d2d0: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2f0: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
d300: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
d310: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
d320: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d330: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
d340: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
d350: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
d360: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
d370: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
d380: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d390: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
d3a0: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
d3b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
d3c0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d3d0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
d3e0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
d3f0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
d400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d410: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d420: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d430: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d440: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
d450: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
d460: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
d470: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d490: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
d4a0: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
d4b0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
d4c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d4d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d4e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d4f0: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
d500: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
d510: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
d520: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
d530: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
d540: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
d550: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
d560: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
d570: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
d580: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
d590: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
d5a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
d5b0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
d5c0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
d5d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
d5e0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
d5f0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
d600: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
d610: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
d620: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
d630: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
d640: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
d650: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
d660: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
d670: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
d680: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d690: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
d6a0: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
d6b0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
d6c0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
d6d0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
d6e0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
d6f0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
d700: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
d710: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
d720: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
d730: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
d740: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
d750: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
d760: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
d770: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
d780: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
d790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d7a0: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
d7b0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
d7c0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
d7d0: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
d7e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d7f0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
d800: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
d810: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
d820: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
d830: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
d840: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
d850: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
d860: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
d870: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
d880: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
d890: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
d8a0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
d8b0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
d8c0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
d8d0: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
d8e0: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
d8f0: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d900: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
d910: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
d920: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
d930: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
d940: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
d950: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
d960: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
d970: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d980: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d990: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
d9a0: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
d9b0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
d9c0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
d9d0: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
d9e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
d9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
da00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
da10: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
da20: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
da30: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
da40: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
da50: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
da60: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
da70: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
da80: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
da90: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
daa0: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
dab0: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
dac0: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
dad0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
dae0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
daf0: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
db00: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
db10: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
db20: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
db30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
db40: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
db50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
db60: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
db70: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
db80: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
db90: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
dba0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dbb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dbc0: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
dbd0: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
dbe0: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
dbf0: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
dc00: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
dc10: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
dc20: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
dc30: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
dc40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dc50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
dc60: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
dc70: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
dc80: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
dc90: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
dca0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
dcb0: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
dcc0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
dcd0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
dce0: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
dcf0: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
dd00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
dd10: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
dd20: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
dd30: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
dd40: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
dd50: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
dd60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dd70: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
dd80: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd90: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
dda0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ddb0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
ddc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ddd0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
dde0: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
ddf0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
de00: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
de10: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
de20: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
de30: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
de40: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
de50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
de60: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
de70: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
de80: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
de90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
deb0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
dec0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
ded0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
dee0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
def0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
df00: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
df10: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
df20: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
df30: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
df40: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
df50: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
df60: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
df70: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
df80: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
df90: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
dfa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
dfb0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
dfc0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
dfd0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
dfe0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
dff0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
e000: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e010: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
e020: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
e030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
e040: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
e050: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
e060: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
e070: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
e080: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
e090: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
e0a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
e0b0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
e0c0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
e0d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
e0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e0f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e100: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
e110: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
e120: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
e130: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
e140: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
e150: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
e160: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
e170: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
e180: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
e190: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
e1a0: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
e1b0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
e1c0: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
e1d0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
e1e0: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
e1f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e200: 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35  F: R-03640-13415
e210: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65   A value of 5 me
e220: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e230: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
e240: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e250: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e260: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e270: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e280: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e290: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31  ENCE-OF: R-20501
e2a0: 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f  -61796 A value o
e2b0: 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70  f 13 means the p
e2c0: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
e2d0: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e2e0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e2f0: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e300: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
e310: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
e320: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
e330: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
e340: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e350: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
e360: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
e370: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
e380: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ad = 0;.      pP
e390: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e3a0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e3b0: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
e3c0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
e3d0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e3e0: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
e3f0: 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  oad = 1;.      p
e400: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
e410: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
e420: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
e430: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e440: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e450: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e460: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
e470: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
e480: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
e490: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
e4a0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
e4b0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
e4c0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
e4d0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e4e0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
e4f0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
e500: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
e510: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
e520: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
e530: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
e540: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
e550: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
e560: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e570: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
e580: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
e590: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e5a0: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
e5b0: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
e5c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e5d0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
e5e0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
e5f0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
e600: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e610: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e620: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
e630: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
e640: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e650: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e660: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e670: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e680: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e690: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e6a0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e6b0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e6c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e6d0: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e6e0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e6f0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e700: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e710: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e730: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e740: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e750: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e760: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e770: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e780: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e790: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e7a0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e7b0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e7c0: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e7d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e7e0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e7f0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e800: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e810: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e820: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e830: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e840: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e850: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e860: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e870: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e880: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e890: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e8a0: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e8b0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e8c0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e8d0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e8e0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e8f0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e910: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e920: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e930: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e940: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e950: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e960: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e970: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e980: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e990: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e9a0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e9b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e9c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9d0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e9e0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e9f0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
ea00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
ea10: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
ea20: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ea30: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
ea40: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
ea50: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
ea60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ea70: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
ea80: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
ea90: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
eaa0: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
eab0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
eac0: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
ead0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
eae0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
eaf0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
eb00: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
eb10: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
eb20: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
eb30: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
eb40: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
eb50: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
eb60: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
eb70: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
eb80: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
eb90: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
eba0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
ebb0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
ebc0: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
ebd0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
ebe0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
ebf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ec00: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ec10: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
ec20: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ec30: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ec40: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec50: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
ec60: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ec70: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
ec80: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
ec90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
eca0: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
ecb0: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
ecc0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
ecd0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
ece0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
ecf0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
ed00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ed10: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
ed20: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ed30: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ed40: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
ed50: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ed60: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ed70: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ed80: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ed90: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
eda0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
edb0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
edc0: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
edd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ede0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
edf0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
ee00: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ee10: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
ee20: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ee30: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
ee40: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
ee50: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ee60: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ee70: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ee80: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ee90: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
eea0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
eeb0: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
eec0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
eed0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
eee0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
eef0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
ef00: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ef10: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ef20: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ef30: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ef40: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ef50: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
ef60: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
ef70: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ef80: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ef90: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
efa0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
efb0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
efc0: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
efd0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
efe0: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
eff0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
f000: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
f010: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
f020: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
f030: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f040: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
f050: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
f060: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f070: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
f080: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
f090: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
f0a0: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
f0b0: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
f0c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
f0d0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
f0e0: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
f0f0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
f100: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
f110: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
f120: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
f130: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
f140: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f150: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f160: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
f170: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
f180: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
f190: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f1a0: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f1b0: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f1c0: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f1d0: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f1e0: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f1f0: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f200: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f210: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f220: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f230: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f240: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f250: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f260: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f270: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f280: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f290: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f2a0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f2b0: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f2c0: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f2d0: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f2e0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f2f0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f300: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f310: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f320: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f330: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f340: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f360: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f370: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f380: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f390: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f3a0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f3b0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f3c0: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f3d0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f3e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f3f0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f400: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f410: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f420: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f430: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f440: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f450: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f460: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f470: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f480: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f490: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f4a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f4b0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f4c0: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f4d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f4e0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f4f0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f500: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f510: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f520: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f530: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f540: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f550: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f560: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f570: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f580: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f590: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f5a0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f5b0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f5c0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f5d0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f5e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f5f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f600: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f610: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f620: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f630: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f640: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f650: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f660: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f670: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f690: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f6a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f6b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f6c0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f6d0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f6e0: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f6f0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f700: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f710: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f720: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f730: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f740: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f750: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f760: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f770: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f780: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f790: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f7a0: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f7b0: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f7c0: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f7d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f7e0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f7f0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f800: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f810: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f820: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f830: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f840: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f850: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f860: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f870: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f880: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f890: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f8a0: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f8b0: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f8c0: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f8d0: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f8e0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f8f0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f900: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f910: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f920: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f930: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f940: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f950: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f960: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f970: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f980: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f9a0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f9b0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f9c0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f9d0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f9e0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f9f0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
fa00: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
fa10: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
fa20: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
fa30: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
fa40: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
fa50: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
fa60: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
fa70: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
fa80: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
fa90: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
faa0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
fab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fac0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
fad0: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fae0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
faf0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
fb00: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
fb10: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
fb20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
fb30: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
fb40: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
fb50: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
fb60: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
fb70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
fb80: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
fb90: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
fba0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
fbb0: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
fbc0: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
fbd0: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
fbe0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
fbf0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fc00: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
fc10: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
fc20: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
fc30: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
fc40: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
fc50: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
fc60: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
fc70: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
fc80: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
fc90: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
fca0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
fcb0: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
fcc0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
fcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fce0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
fcf0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
fd00: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
fd10: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
fd20: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fd30: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fd40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fd50: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fd60: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fd70: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fd80: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fd90: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fda0: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fdb0: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fdc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fdd0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fde0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fdf0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fe00: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fe10: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fe20: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fe30: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fe40: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
fe50: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fe60: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fe70: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fe80: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fe90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fea0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
feb0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fec0: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fee0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fef0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
ff00: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
ff10: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
ff20: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ff30: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ff40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ff50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ff60: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
ff70: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ff80: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ff90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
ffa0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
ffb0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
ffc0: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
ffd0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
ffe0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
fff0: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
10000 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
10010 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
10020 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
10030 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
10040 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
10050 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
10060 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
10070 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10080 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
10090 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
100a0 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
100b0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
100c0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
100d0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
100e0 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
100f0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
10100 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
10110 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
10120 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
10130 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
10140 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
10150 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
10160 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
10170 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
10180 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
10190 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
101a0 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
101b0 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
101c0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
101d0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
101e0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
101f0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
10200 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
10210 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
10220 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
10230 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
10240 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
10250 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
10260 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
10270 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10280 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
10290 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
102a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
102b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
102c0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
102d0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
102e0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
102f0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
10300 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10310 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
10320 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
10330 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
10340 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
10350 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
10360 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
10370 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10380 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
10390 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
103a0 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
103b0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
103c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
103d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
103e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
103f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10400 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
10410 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10420 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
10430 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
10440 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
10450 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
10460 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
10470 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
10480 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
10490 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
104a0 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
104b0 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
104c0 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
104d0 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
104e0 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
104f0 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
10500 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
10510 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
10520 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
10530 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
10540 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
10550 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
10560 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
10570 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
10580 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
10590 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
105a0 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
105b0 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
105c0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
105d0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
105e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
105f0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10610 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
10620 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
10630 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
10640 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
10650 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
10660 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
10670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10680 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10690 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
106a0 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
106b0 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
106c0 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
106d0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
106e0 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
106f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
10700 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10710 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
10720 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10730 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10740 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
10750 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
10760 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
10770 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10780 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
10790 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
107a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
107b0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
107c0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
107d0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
107e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
10800 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
10810 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10820 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
10830 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
10840 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
10850 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
10860 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
10870 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10880 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10890 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
108a0 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
108b0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
108c0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
108d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
108e0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
108f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10900 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10910 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10920 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
10930 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
10940 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
10950 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
10960 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
10970 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
10980 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10990 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
109a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
109b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
109c0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
109d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
109e0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
109f0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
10a00 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
10a10 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
10a20 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
10a30 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
10a40 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
10a50 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
10a60 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
10a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
10a80 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
10a90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10aa0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10ab0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10ac0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10ad0 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10ae0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10af0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
10b00 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
10b10 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10b20 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
10b30 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
10b40 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
10b50 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
10b60 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
10b70 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
10b80 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
10b90 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10ba0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10bb0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10bc0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10bd0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10be0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10bf0 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
10c00 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
10c10 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
10c20 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
10c30 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
10c40 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
10c50 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10c60 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10c70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10c80 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10c90 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10ca0 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10cb0 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10cc0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10cd0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10cf0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
10d00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10d30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
10d40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10d60 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10d70 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10d80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10da0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10db0 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10dc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10df0 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10e00 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10e10 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e30 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10e40 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10e50 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10e60 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10e70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10e80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10e90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10ea0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10eb0 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10ec0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10ee0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10ef0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
10f00 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
10f10 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10f20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
10f30 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
10f40 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
10f50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10f60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10f70 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
10f80 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10f90 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10fa0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
10fb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
10fc0 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
10fd0 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
10fe0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10ff0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11000 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11010 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  }.  *ppPage = bt
11020 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11030 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
11040 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70   pBt);.  if( (*p
11050 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
11060 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  0 ){.    rc = bt
11070 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
11080 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
110a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
110b0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
110c0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
110d0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
110e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  }.  }..  /* If o
110f0 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
11100 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
11110 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
11120 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
11130 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
11140 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
11150 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
11160 20 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70   pCur.   && ((*p
11170 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
11180 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
11190 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
111a0 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20  ntKey).  ){.    
111b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
111c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
111d0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
111e0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
111f0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11200 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
11210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
11220 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11230 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
11240 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
11250 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
11260 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11270 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
11280 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
11290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
112a0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
112b0 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
112c0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
112d0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
112e0 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
112f0 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
11300 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11310 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
11320 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
11330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11340 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
11350 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
11360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11370 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
11380 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11390 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
113a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
113b0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
113c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
113d0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
113e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
113f0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
11400 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11410 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11420 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11430 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
11440 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
11450 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
11460 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
11470 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
11480 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
11490 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
114a0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
114b0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
114c0 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
114d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
114e0 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
114f0 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
11500 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
11510 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
11520 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
11530 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
11540 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
11550 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
11560 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
11570 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
11580 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
11590 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
115a0 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
115b0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
115c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
115d0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
115e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
115f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
11600 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
11610 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
11620 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11630 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
11640 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
11650 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
11660 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
11670 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
11680 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11690 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
116a0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
116b0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
116c0 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
116d0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
116e0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
116f0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
11700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11710 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11720 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11730 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
11740 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
11750 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11760 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
11770 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
11780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11790 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
117a0 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
117b0 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
117c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
117d0 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
117e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
117f0 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
11800 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
11810 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
11820 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
11830 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
11840 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
11850 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11860 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11870 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
11880 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
11890 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
118a0 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
118b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
118c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
118d0 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
118e0 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
118f0 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
11900 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
11910 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
11920 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
11930 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
11940 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
11950 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
11960 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11970 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
11980 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
11990 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
119a0 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
119b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
119c0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
119d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
119e0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
119f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11a00 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11a10 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11a20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11a30 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
11a40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11a50 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
11a60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
11a70 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
11a80 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
11a90 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11aa0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11ab0 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11ac0 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11ad0 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11ae0 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11af0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
11b00 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
11b10 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
11b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11b30 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
11b40 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
11b50 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
11b60 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
11b70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
11b80 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
11b90 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11ba0 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11bb0 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11bc0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11bd0 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11be0 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11bf0 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
11c00 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
11c10 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
11c20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11c30 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11c40 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
11c50 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11c60 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11c70 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11c80 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11c90 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11ca0 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11cb0 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11cd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11ce0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11cf0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
11d00 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11d10 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
11d20 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
11d30 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
11d40 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
11d50 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11d60 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11d70 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11d80 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11d90 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11da0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11db0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11dc0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11dd0 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11de0 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11df0 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11e00 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11e10 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11e20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11e30 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11e40 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11e50 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11e60 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11e70 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11e80 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11e90 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11ea0 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11eb0 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11ec0 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11ed0 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11ee0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11ef0 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11f00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11f10 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11f20 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11f30 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11f40 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
11f50 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
11f60 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
11f70 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
11f80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
11f90 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
11fa0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
11fb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11fc0 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
11fd0 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
11fe0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
11ff0 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
12000 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
12010 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
12020 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
12030 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
12040 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
12050 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
12060 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12070 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
12080 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
12090 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
120a0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
120b0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
120c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
120d0 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
120e0 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
120f0 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
12100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12110 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
12120 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
12130 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
12140 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
12150 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12160 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
12170 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
12180 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
12190 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
121a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
121b0 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
121c0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
121d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
121f0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
12200 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12210 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
12220 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
12230 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
12240 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
12250 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
12260 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
12270 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
12280 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
12290 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
122b0 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
122c0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
122d0 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
122e0 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
122f0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
12300 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
12310 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12320 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
12330 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12340 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
12350 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
12360 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
12370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12380 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
12390 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
123a0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
123b0 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
123c0 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
123d0 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
123e0 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
123f0 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
12400 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
12410 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
12420 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
12430 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
12440 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
12450 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
12460 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
12470 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
12480 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12490 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
124a0 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
124b0 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
124c0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
124d0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
124e0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
124f0 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
12500 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
12510 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
12520 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
12530 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
12540 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12560 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
12570 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
12580 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
125a0 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
125b0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
125c0 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
125d0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
125e0 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
125f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12610 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
12620 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
12630 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
12640 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
12650 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
12660 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
12670 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
12680 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
12690 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
126a0 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
126b0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
126c0 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
126d0 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
126e0 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
126f0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
12700 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
12710 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
12720 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
12730 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
12740 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
12750 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
12760 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12770 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
12780 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
12790 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
127a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
127b0 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
127c0 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
127d0 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
127e0 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
127f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12800 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
12810 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
12820 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
12830 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
12840 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
12850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12870 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12880 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
12890 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
128a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
128b0 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
128c0 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
128d0 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
128e0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
128f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12900 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12910 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12930 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
12940 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
12950 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
12960 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
12970 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
12980 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
12990 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
129a0 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
129b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
129c0 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
129d0 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
129e0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
129f0 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
12a00 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
12a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12a20 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
12a30 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
12a40 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12a50 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
12a60 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
12a70 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12a80 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
12a90 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12aa0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12ab0 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12ac0 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12ad0 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12ae0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12af0 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
12b00 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
12b10 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12b20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
12b30 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
12b40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12b50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12b60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12b80 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12b90 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
12ba0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
12bb0 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
12bc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12bd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12be0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12bf0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
12c00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
12c30 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
12c40 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
12c50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
12c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
12c70 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12c90 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
12ca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12cc0 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12cd0 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
12ce0 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
12cf0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
12d00 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
12d10 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
12d20 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
12d30 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
12d40 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
12d50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12d60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12d70 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
12d80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12d90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
12da0 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
12db0 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
12dc0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
12dd0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
12de0 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
12df0 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
12e00 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12e10 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
12e20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
12e30 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
12e40 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
12e50 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
12e60 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
12e70 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12e80 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
12e90 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
12ea0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
12eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12ec0 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
12ed0 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
12ee0 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
12ef0 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
12f00 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
12f10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12f20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
12f30 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
12f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12f50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12f60 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12f70 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
12f80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12f90 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
12fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12fb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12fc0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12fd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fe0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
12ff0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13000 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13010 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
13020 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
13030 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
13040 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
13050 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
13060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13080 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13090 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
130a0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
130b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
130c0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
130d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
130e0 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
130f0 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
13100 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
13110 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
13120 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
13130 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
13140 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
13150 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
13160 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
13170 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
13180 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
13190 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
131a0 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
131b0 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
131c0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
131d0 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
131e0 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
131f0 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
13200 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
13210 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
13220 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
13230 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
13240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
13250 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
13260 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
13270 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
13280 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
13290 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
132a0 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
132b0 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
132c0 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
132d0 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
132e0 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
132f0 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
13300 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
13340 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
13380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
13390 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
133a0 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
133b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
133c0 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
133d0 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
133e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
133f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13400 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13410 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13430 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
13440 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
13450 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
13480 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
13490 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
134a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
134b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
134c0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
134d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
134e0 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
134f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13500 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13510 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
13520 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
13530 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
13540 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13560 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13570 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
13580 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
13590 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
135a0 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
135b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
135c0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
135d0 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
135e0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
135f0 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
13600 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
13610 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13620 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
13630 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
13640 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
13650 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
13660 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
13670 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13680 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
13690 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
136a0 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
136b0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
136c0 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
136d0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
136e0 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
136f0 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
13700 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
13710 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
13720 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
13730 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
13740 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
13750 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
13760 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
13770 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
13780 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13790 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
137a0 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
137b0 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
137c0 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
137d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
137e0 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
137f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
13800 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
13810 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
13820 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
13830 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
13840 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
13850 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
13860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13870 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13880 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
13890 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
138a0 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
138b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
138c0 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
138d0 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
138e0 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
138f0 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
13900 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
13910 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
13920 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13930 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
13940 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
13950 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
13960 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
13970 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
13980 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
13990 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
139a0 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
139b0 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
139c0 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
139d0 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
139e0 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
139f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13a00 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
13a10 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13a20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13a30 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
13a40 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
13a50 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
13a60 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13a70 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
13a80 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
13a90 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13aa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13ab0 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
13ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13ad0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13ae0 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
13af0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
13b00 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
13b10 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
13b20 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
13b30 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
13b40 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
13b50 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
13b60 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
13b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
13b80 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
13b90 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
13ba0 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
13bb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13bc0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13bd0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
13be0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13bf0 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
13c00 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13c10 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13c20 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
13c30 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
13c40 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
13c50 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
13c60 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
13c70 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13c80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13c90 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
13ca0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
13cb0 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
13cc0 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
13cd0 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
13ce0 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
13cf0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
13d00 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
13d10 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
13d20 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
13d30 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
13d40 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
13d50 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
13d60 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
13d70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13d80 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13da0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
13db0 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
13dc0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13dd0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
13de0 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
13df0 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
13e00 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
13e10 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
13e20 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13e30 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13e40 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e  d; ).      pBt->
13e50 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
13e60 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
13e70 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13e80 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13e90 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13ea0 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
13eb0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
13ec0 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
13ed0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
13ee0 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
13ef0 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
13f00 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
13f10 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13f20 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
13f30 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
13f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13f50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13f60 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
13f70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
13f80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13f90 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13fb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13fc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13fd0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13fe0 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
13ff0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14000 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14010 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
14020 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14030 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14040 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
14050 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14060 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14070 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
14080 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
14090 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
140a0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
140b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
140c0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
140d0 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
140e0 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
140f0 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
14100 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
14110 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
14120 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
14130 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
14140 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
14150 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
14160 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
14170 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
14180 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
14190 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
141a0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
141c0 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
141d0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
141e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
141f0 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
14200 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
14210 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
14220 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14230 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
14240 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
14250 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
14260 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
14270 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14280 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14290 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
142a0 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
142b0 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
142c0 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
142d0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
142e0 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
142f0 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
14300 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
14310 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
14320 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
14330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14340 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14350 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
14360 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
14370 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
14380 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
14390 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
143a0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
143b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
143c0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
143d0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
143e0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
143f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14400 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
14410 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
14420 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
14430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14440 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
14450 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
14460 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14470 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
14480 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
14490 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
144a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
144b0 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
144c0 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
144d0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
144e0 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
144f0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
14500 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
14510 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
14520 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
14530 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
14540 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
14550 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
14560 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
14570 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
14580 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
14590 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
145a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
145b0 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
145c0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
145d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
145e0 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
145f0 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
14600 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
14610 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IZE);.    }.  }.
14620 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
14630 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
14640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14650 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
14660 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14670 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14680 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
14690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
146a0 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
146b0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
146c0 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
146d0 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
146e0 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
146f0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
14700 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
14710 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
14720 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
14730 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
14740 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
14750 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
14760 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
14770 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
14780 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
14790 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
147a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
147b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
147c0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
147d0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
147e0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
147f0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
14800 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
14810 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
14820 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14830 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
14840 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
14850 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
14860 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
14870 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14880 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
14890 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
148a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
148b0 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
148c0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
148d0 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
148e0 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
148f0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14900 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
14910 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
14920 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14930 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14940 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
14950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14960 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
14970 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14980 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14990 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
149a0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
149b0 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
149c0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
149d0 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
149e0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
149f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
14a00 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
14a10 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
14a20 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14a30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14a40 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
14a50 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
14a60 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
14a70 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
14a80 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
14a90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14aa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14ab0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14ac0 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14ad0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14af0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
14b00 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
14b10 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
14b20 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
14b30 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
14b40 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
14b50 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
14b60 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
14b70 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
14b80 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
14b90 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14ba0 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14bb0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14bc0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14bd0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14be0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14bf0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14c00 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
14c10 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
14c20 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
14c30 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
14c40 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
14c50 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14c60 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14c70 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14c80 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14c90 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14ca0 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14cb0 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14cc0 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14cd0 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14ce0 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14cf0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
14d00 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
14d10 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
14d20 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
14d30 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
14d40 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
14d50 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
14d60 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
14d70 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
14d80 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
14d90 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
14da0 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
14db0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
14dc0 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
14dd0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
14de0 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
14df0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
14e00 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
14e10 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
14e20 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
14e30 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
14e40 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
14e50 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
14e60 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
14e70 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
14e80 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
14e90 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14ea0 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
14eb0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
14ec0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
14ed0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
14ee0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
14ef0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
14f00 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
14f10 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
14f20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
14f30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
14f40 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
14f50 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
14f60 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
14f70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
14f80 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
14f90 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
14fa0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
14fb0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
14fc0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
14fd0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
14fe0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
14ff0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
15000 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
15010 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
15020 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15030 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15040 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
15050 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
15060 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
15070 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15080 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
15090 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
150a0 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
150b0 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
150c0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
150d0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
150e0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
150f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15100 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
15110 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
15120 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
15130 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
15140 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
15150 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15160 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15170 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15180 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15190 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
151a0 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
151b0 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
151c0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
151d0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
151e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
151f0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
15200 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15210 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
15220 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
15230 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
15240 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
15250 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
15260 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
15270 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
15280 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
15290 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
152a0 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
152b0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
152c0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
152d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
152e0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
152f0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
15300 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15310 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
15320 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
15330 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
15340 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
15350 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
15360 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
15370 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
15380 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
15390 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
153a0 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
153b0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
153c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
153d0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
153e0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
153f0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
15400 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
15410 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
15420 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
15430 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
15440 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
15450 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
15460 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
15470 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
15480 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
15490 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
154a0 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
154b0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
154c0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
154d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
154e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
154f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
15500 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
15510 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
15520 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
15530 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
15540 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
15550 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
15560 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
15570 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
15580 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
15590 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
155a0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
155b0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
155c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
155d0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
155e0 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
155f0 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
15600 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
15610 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
15620 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
15630 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
15640 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
15650 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
15660 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
15670 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
15680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
15690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
156a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
156b0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
156c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
156d0 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
156e0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
156f0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
15700 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
15710 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
15720 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
15730 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
15740 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
15750 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
15760 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
15770 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
15780 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
15790 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
157a0 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
157b0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
157c0 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
157d0 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
157e0 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
157f0 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
15800 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
15810 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
15820 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
15830 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
15840 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
15850 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
15860 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
15870 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
15880 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
15890 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
158a0 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
158b0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
158c0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
158d0 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
158e0 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
158f0 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
15900 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
15910 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
15920 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
15930 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
15940 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
15950 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
15960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15970 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
15980 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15990 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
159a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
159b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
159c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
159d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
159e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
159f0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
15a00 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15a10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15a20 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15a30 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15a50 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
15a60 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15a70 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15a80 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15a90 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15aa0 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15ab0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15ac0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15ad0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15ae0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15af0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15b00 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15b10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15b20 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15b30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15b40 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15b50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15b60 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15b70 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15b80 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15b90 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15ba0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15bb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15bc0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15bd0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15be0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15bf0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15c00 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15c10 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15c20 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15c30 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15c40 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15c50 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15c60 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15c70 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15c80 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15c90 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15ca0 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15cb0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15cc0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15cd0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15ce0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15cf0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15d00 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15d10 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15d20 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15d30 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15d40 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15d50 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15d60 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15d70 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15d80 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15d90 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15da0 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15dc0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15dd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15de0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15df0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15e10 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15e20 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15e30 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15e40 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15e50 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15e60 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15e70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15e80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15e90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15ea0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15eb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15ec0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15ed0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15ee0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15ef0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
15f00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
15f30 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15f40 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
15f50 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
15f60 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
15f70 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
15f80 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
15f90 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
15fa0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15fb0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15fc0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
15fd0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
15fe0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15ff0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
16000 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16010 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16020 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
16030 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
16040 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
16050 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
16060 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
16070 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
16080 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
16090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
160a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
160b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
160c0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
160d0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
160e0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
160f0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
16100 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
16110 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
16120 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16130 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
16140 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
16150 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
16160 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
16170 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
16180 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
16190 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
161a0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
161b0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
161c0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
161d0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
161e0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
161f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16200 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
16210 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16220 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16230 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
16240 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
16250 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
16260 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16270 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
16280 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
16290 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
162a0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
162b0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
162c0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
162d0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
162e0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
162f0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
16300 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16310 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16320 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16330 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16340 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
16350 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
16360 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
16370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
16380 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
16390 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
163a0 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
163b0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
163c0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
163d0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
163e0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
163f0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
16400 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
16410 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16420 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
16430 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
16440 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
16450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
16460 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16470 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16480 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
16490 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
164a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
164b0 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
164c0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
164d0 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
164e0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
164f0 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
16500 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
16510 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16520 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
16530 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
16540 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
16550 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16560 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
16570 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16580 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
16590 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
165a0 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
165b0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
165c0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
165d0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
165e0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
165f0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
16600 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
16610 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
16620 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
16630 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
16640 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
16650 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16660 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
16670 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16680 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16690 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
166a0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
166b0 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
166c0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
166d0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
166e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
166f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16700 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
16710 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
16720 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
16730 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
16740 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
16750 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
16760 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16770 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
16780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16790 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
167a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
167b0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
167c0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
167d0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
167e0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
167f0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
16800 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
16810 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
16820 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16830 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
16840 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16850 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
16860 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
16870 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
16880 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16890 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
168a0 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
168b0 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
168c0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
168d0 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
168e0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
168f0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
16900 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
16910 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
16920 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
16930 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
16940 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
16950 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16960 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
16970 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
16980 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
16990 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
169a0 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
169b0 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
169c0 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
169d0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
169e0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
169f0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
16a00 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
16a10 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
16a20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16a30 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16a40 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16a50 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
16a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16a70 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
16a80 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
16a90 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16aa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16ab0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16ac0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16ad0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16ae0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16af0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
16b00 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
16b10 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
16b20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
16b30 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
16b40 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
16b50 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
16b60 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
16b70 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
16b80 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
16b90 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16ba0 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16bb0 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16bc0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16bd0 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16be0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16bf0 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
16c00 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
16c10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
16c20 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
16c30 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16c40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16c50 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16c60 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16c70 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16c80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16c90 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16ca0 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16cb0 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16cc0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16cd0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16ce0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16cf0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
16d00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
16d10 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16d20 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
16d30 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
16d40 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
16d50 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16d60 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16d70 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16d80 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16d90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16da0 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16db0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16dc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16dd0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16de0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16df0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16e00 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16e20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16e30 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16e40 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16e50 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16e60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16e70 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16e80 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16e90 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16ea0 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16eb0 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16ec0 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16ed0 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16ee0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16ef0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16f00 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
16f10 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
16f20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
16f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16f40 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
16f50 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16f60 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
16f70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
16f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
16f90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16fa0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
16fb0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
16fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16fd0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16fe0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
16ff0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
17000 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
17010 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
17020 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
17030 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
17040 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
17050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17060 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17070 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
17080 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
17090 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
170a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
170b0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
170c0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
170d0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
170e0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
170f0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
17100 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
17110 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
17120 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
17130 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
17140 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
17150 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17160 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
17170 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
17180 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
17190 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
171a0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
171b0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
171c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
171d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
171e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
171f0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
17200 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17210 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17230 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
17240 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
17250 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17260 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
17270 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
17280 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
17290 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
172a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
172b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
172c0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
172d0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
172e0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
172f0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
17300 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
17310 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
17340 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
17350 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
17360 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
17370 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
17380 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
17390 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
173a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
173b0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
173c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
173d0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
173e0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
173f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17400 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
17410 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17420 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
17430 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
17440 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
17450 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
17460 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
17470 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
17480 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
17490 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
174a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
174b0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
174c0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
174d0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
174e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
174f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17500 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
17510 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
17520 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
17530 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
17540 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
17550 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
17560 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
17570 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
17580 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17590 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
175a0 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
175b0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
175c0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
175d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
175e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
175f0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
17600 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
17610 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
17620 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
17630 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
17640 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
17650 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
17660 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
17670 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
17680 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17690 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
176a0 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
176b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
176c0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
176d0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
176e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
176f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17700 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17710 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17720 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
17730 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
17740 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
17750 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17770 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
17780 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
17790 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
177a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
177b0 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
177c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
177d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
177e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
177f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
17800 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
17810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
17820 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
17830 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
17840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17850 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
17860 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17870 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
17880 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17890 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
178a0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
178b0 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
178c0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
178d0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
178e0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
178f0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
17900 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
17910 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
17920 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
17930 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
17940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17950 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
17960 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
17970 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
17980 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
17990 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
179a0 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
179b0 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
179c0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
179d0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
179e0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
179f0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
17a00 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
17a10 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
17a20 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
17a30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17a40 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
17a50 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17a60 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
17a70 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
17a80 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
17a90 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17aa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17ab0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17ac0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17ad0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17ae0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17af0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
17b00 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
17b10 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17b20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
17b30 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17b40 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
17b50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17b60 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
17b70 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
17b80 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17b90 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17ba0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17bb0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17bc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17bd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17be0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17bf0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
17c00 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17c10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17c20 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17c30 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
17c40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17c50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17c60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17c70 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17c80 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17c90 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17ca0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17cb0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17cc0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17cd0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17ce0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17cf0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
17d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17d10 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
17d20 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
17d30 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
17d40 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
17d50 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17d60 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17d70 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17d80 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17d90 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17da0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17db0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17dc0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17dd0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17de0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17df0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17e00 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17e10 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17e20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17e30 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17e40 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17e50 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17e70 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17e90 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17ea0 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17eb0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ed0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17ee0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17ef0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17f00 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
17f10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17f20 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
17f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17f40 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
17f50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
17f60 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
17f70 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
17f80 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
17f90 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
17fa0 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
17fb0 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
17fc0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
17fd0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
17fe0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
17ff0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
18000 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
18010 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
18020 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
18030 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
18040 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
18050 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
18060 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
18070 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
18080 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
18090 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
180a0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
180b0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
180c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
180d0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
180e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
180f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
18100 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
18110 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
18120 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
18130 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
18140 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
18150 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
18160 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
18170 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
18180 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
18190 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
181a0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
181b0 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
181c0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
181d0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
181e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
181f0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
18200 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
18210 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
18220 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
18230 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
18240 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
18250 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
18260 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
18270 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
18280 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
18290 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
182a0 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
182b0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
182c0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
182d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
182e0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
182f0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
18300 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18310 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
18320 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
18330 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
18340 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
18350 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
18360 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18370 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
18380 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
18390 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
183a0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
183b0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
183c0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
183d0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
183e0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
183f0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
18400 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
18410 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18420 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
18430 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
18440 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
18450 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
18460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18470 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
18480 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
18490 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
184a0 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
184b0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
184c0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
184d0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
184e0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
184f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18500 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
18510 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
18520 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
18530 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
18540 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
18550 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
18560 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
18570 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
18580 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
18590 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
185a0 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
185b0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
185c0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
185d0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
185e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
185f0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
18600 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
18610 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
18620 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18630 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
18640 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18650 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
18660 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
18670 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18680 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
18690 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
186a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
186b0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
186c0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
186d0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
18700 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
18710 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18720 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18730 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
18740 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
18750 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
18760 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
18770 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18780 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18790 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
187a0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
187b0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
187c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
187d0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
187e0 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
187f0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
18800 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
18810 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
18820 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
18830 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
18840 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
18850 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
18860 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
18870 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
18880 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
18890 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
188a0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
188b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
188c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
188d0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
188e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
188f0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
18900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18910 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
18920 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
18930 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18940 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
18950 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
18960 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18970 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
18980 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
18990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
189a0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
189b0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
189c0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
189d0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
189e0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
189f0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
18a00 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
18a10 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
18a20 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
18a30 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
18a40 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
18a50 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
18a60 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
18a70 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
18a80 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
18a90 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
18aa0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
18ab0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
18ac0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
18ad0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
18ae0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
18af0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
18b00 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
18b10 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
18b20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
18b30 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
18b40 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
18b50 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
18b60 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
18b70 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
18b80 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
18b90 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
18ba0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
18bb0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
18bc0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
18bd0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
18be0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
18bf0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18c00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18c10 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
18c20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
18c30 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18c40 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18c50 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18c60 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
18c70 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18c80 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
18c90 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
18ca0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18cb0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18cc0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
18cd0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
18ce0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18cf0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
18d00 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
18d10 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
18d20 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
18d30 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
18d40 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
18d50 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
18d60 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
18d70 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
18d80 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
18d90 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
18da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
18db0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18dc0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
18dd0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
18de0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
18df0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18e00 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18e10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18e20 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
18e30 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
18e40 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
18e50 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
18e60 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
18e70 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
18e80 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
18e90 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
18ea0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
18eb0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
18ec0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
18ed0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
18ee0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
18ef0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
18f00 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
18f10 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
18f20 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
18f30 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
18f40 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
18f50 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
18f60 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
18f70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
18f80 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
18f90 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
18fa0 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
18fb0 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
18fc0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
18fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
18fe0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
18ff0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
19000 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
19010 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
19020 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
19030 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
19040 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
19050 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
19060 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
19070 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
19080 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
19090 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
190a0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
190b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
190c0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
190d0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
190e0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
190f0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
19100 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
19110 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
19120 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
19130 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
19140 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
19150 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19160 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
19170 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
19180 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19190 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
191a0 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
191b0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
191c0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
191d0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
191e0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
191f0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
19200 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
19210 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19220 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
19230 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19240 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
19250 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19260 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19270 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19280 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
19290 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
192a0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
192b0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
192c0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
192d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
192e0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
192f0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
19300 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
19310 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19320 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
19330 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
19340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
19350 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19360 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
19370 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
19380 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
19390 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
193a0 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  l(pPage1);.  }.}
193b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
193c0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
193d0 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
193e0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
193f0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
19400 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
19410 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
19420 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19430 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
19440 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
19450 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
19460 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19470 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
19480 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19490 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
194a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
194b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
194c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
194d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
194e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
194f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
19500 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
19510 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
19520 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
19530 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
19540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19550 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
19560 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19570 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
19580 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
19590 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
195a0 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
195b0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
195c0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
195d0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
195e0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
195f0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
19600 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
19610 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
19620 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
19630 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
19640 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
19650 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
19660 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
19670 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
19680 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
19690 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
196a0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
196b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
196c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
196d0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
196e0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
196f0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
19700 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
19710 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
19720 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
19730 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
19740 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
19750 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
19760 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
19770 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
19780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19790 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
197a0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
197b0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
197c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
197d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
197e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
197f0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
19800 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
19810 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
19820 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
19830 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
19840 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
19850 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
19860 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
19870 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
19880 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
19890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
198a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
198b0 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
198c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
198d0 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
198e0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
198f0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
19900 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
19910 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
19920 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
19930 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
19940 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
19950 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19960 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
19970 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
19980 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
19990 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
199a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
199b0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
199c0 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
199d0 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
199e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
199f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19a10 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
19a20 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
19a30 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
19a40 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
19a50 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
19a60 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
19a70 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
19a80 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
19a90 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19aa0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19ab0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
19ac0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
19ad0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19ae0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
19af0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
19b00 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
19b10 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
19b20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
19b30 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
19b40 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
19b50 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
19b60 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
19b70 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19b80 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
19b90 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
19ba0 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
19bb0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
19bc0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
19bd0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19be0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19bf0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
19c00 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
19c10 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
19c20 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
19c30 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
19c40 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
19c50 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
19c60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19c70 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
19c80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
19c90 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19ca0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19cb0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19cc0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
19cd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19ce0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
19cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
19d00 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
19d10 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
19d20 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
19d30 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
19d40 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19d50 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
19d60 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
19d70 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
19d80 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
19d90 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
19da0 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
19db0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
19dc0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
19dd0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
19de0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
19df0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
19e00 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
19e10 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
19e20 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19e30 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
19e40 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
19e50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
19e60 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
19e70 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
19e80 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
19e90 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
19ea0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
19eb0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
19ec0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
19ed0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
19ee0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
19ef0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
19f00 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
19f10 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
19f20 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
19f30 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
19f40 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
19f50 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
19f60 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
19f70 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
19f80 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
19f90 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
19fa0 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
19fb0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
19fc0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
19fd0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
19fe0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
19ff0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1a000 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1a010 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1a020 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1a030 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1a040 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1a050 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1a060 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1a070 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1a080 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1a090 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1a0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a0b0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1a0c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1a0d0 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
1a0e0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
1a0f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a100 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1a110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
1a120 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a130 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1a140 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1a150 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1a160 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1a170 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1a180 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1a190 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1a1a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1a1b0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1a1c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1a1d0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1a1e0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1a1f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1a200 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1a210 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a220 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1a230 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1a240 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1a250 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1a260 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1a270 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1a280 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1a290 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1a2a0 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1a2b0 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1a2c0 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1a2d0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1a2e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1a2f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1a300 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1a310 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1a320 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a330 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1a340 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1a350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a360 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1a370 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1a380 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a390 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1a3a0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1a3b0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
1a3c0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1a3d0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1a3e0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1a3f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1a400 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1a410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1a420 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
1a430 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1a440 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a450 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c  ANS_WRITE).   ||
1a460 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1a470 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1a480 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  0.  ){.    pBloc
1a490 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
1a4a0 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
1a4b0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1a4c0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1a4d0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
1a4e0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1a4f0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1a500 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1a510 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1a520 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
1a530 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1a540 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1a550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1a570 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
1a580 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1a590 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1a5a0 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
1a5b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
1a5c0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
1a5d0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a5e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a5f0 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
1a600 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
1a610 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
1a620 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
1a630 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
1a640 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
1a650 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
1a660 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
1a670 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
1a680 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
1a690 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
1a6a0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
1a6b0 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
1a6c0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1a6d0 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
1a6e0 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
1a6f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1a700 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
1a710 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
1a720 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1a730 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1a740 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1a750 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
1a760 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
1a770 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1a780 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
1a790 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
1a7a0 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
1a7b0 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
1a7c0 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
1a7d0 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
1a7e0 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
1a7f0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
1a800 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
1a810 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
1a820 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1a830 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
1a840 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
1a850 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
1a860 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
1a870 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
1a880 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
1a890 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
1a8a0 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
1a8b0 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
1a8c0 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
1a8d0 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
1a8e0 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
1a8f0 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
1a900 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1a910 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
1a920 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
1a930 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
1a940 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
1a950 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
1a960 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
1a970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1a980 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
1a990 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a9a0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1a9b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1a9c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a9d0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1a9e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a9f0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1aa00 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
1aa10 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
1aa20 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
1aa30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1aa40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1aa50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
1aa60 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1aa70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aa80 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1aa90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aaa0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1aab0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1aac0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1aad0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1aae0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1aaf0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ab00 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1ab10 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1ab20 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1ab30 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
1ab40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ab50 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1ab60 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1ab70 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1ab80 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
1ab90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1aba0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1abb0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
1abc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1abd0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
1abe0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
1abf0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
1ac00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1ac10 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
1ac20 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
1ac30 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
1ac40 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
1ac50 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
1ac60 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
1ac70 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1ac80 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
1ac90 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
1aca0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
1acb0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1acc0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
1acd0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
1ace0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1acf0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
1ad00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1ad10 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
1ad20 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1ad30 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
1ad40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ad50 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1ad60 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
1ad70 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
1ad80 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
1ad90 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
1ada0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1adb0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1adc0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
1add0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1ade0 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
1adf0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
1ae00 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
1ae10 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1ae20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
1ae30 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
1ae40 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
1ae50 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
1ae60 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1ae70 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
1ae80 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
1ae90 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
1aea0 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
1aeb0 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
1aec0 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
1aed0 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
1aee0 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
1aef0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
1af00 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
1af10 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
1af20 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
1af30 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
1af40 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
1af50 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1af60 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
1af70 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
1af80 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
1af90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1afa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1afb0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1afc0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1afd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1afe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1aff0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1b000 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1b010 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
1b020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b030 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
1b040 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b050 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1b060 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1b070 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1b080 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1b090 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1b0a0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
1b0b0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1b0c0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1b0d0 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1b0e0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1b0f0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1b100 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1b110 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1b120 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1b130 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1b140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b150 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1b160 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1b170 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1b180 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1b190 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1b1a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b1b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b1c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b1d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b1e0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1b1f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1b200 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1b210 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1b220 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1b230 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1b240 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1b250 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1b260 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1b270 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1b280 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1b290 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1b2a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1b2b0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1b2c0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1b2d0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1b300 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1b310 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b340 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1b350 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b380 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1b390 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b3a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
1b3b0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1b3c0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
1b3d0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1b3e0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1b3f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b400 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1b410 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b420 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1b430 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1b440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b450 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
1b460 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
1b470 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
1b480 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1b490 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1b4a0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1b4b0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1b4c0 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1b4d0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1b4e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1b4f0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1b500 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1b510 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1b520 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1b530 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1b540 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b550 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b560 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b570 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b580 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b590 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1b5a0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1b5b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b5c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b5d0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1b5e0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1b5f0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1b600 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1b610 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1b620 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
1b630 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1b640 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
1b650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1b660 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1b670 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1b680 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1b690 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1b6a0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1b6b0 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1b6c0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1b6d0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1b6e0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1b6f0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1b700 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1b710 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1b720 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1b730 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1b740 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1b750 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1b770 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1b780 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1b790 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1b7a0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b7b0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b7c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1b7f0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1b800 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1b810 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1b820 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1b830 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1b840 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1b850 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1b860 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b870 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1b880 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1b890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b8a0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1b8b0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1b8c0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1b8d0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1b8e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1b8f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b900 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b910 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1b920 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1b930 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1b940 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1b950 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1b960 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1b970 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1b980 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1b990 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1b9a0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1b9b0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1b9c0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1b9d0 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1b9e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1b9f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ba00 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
1ba10 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1ba20 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
1ba30 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
1ba40 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
1ba50 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
1ba60 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1ba70 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1ba80 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1ba90 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1baa0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1bab0 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1bac0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1bad0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1bae0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1baf0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1bb00 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1bb10 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1bb20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bb30 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1bb40 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1bb50 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1bb60 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1bb70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1bb80 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
1bb90 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
1bba0 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1bbb0 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
1bbc0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1bbd0 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
1bbe0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
1bbf0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1bc00 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
1bc10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1bc20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
1bc30 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1bc40 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
1bc50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bc60 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1bc70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1bc80 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1bc90 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1bca0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1bcb0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1bcc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bcd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bce0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1bcf0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1bd00 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1bd10 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1bd20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1bd30 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bd40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1bd50 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1bd60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bd70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bd80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1bd90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1bda0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1bdb0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1bdc0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1bdd0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1bde0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1bdf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1be00 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1be10 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1be20 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1be30 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1be40 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1be50 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1be60 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1be70 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1be80 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1be90 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1bea0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1beb0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1bec0 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1bed0 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1bee0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1bef0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1bf00 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1bf10 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1bf20 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1bf30 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1bf40 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1bf50 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1bf60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1bf70 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1bf80 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1bf90 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1bfa0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1bfb0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1bfc0 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1bfd0 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1bfe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bff0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1c000 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1c010 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c020 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1c030 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c040 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1c050 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c060 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1c070 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1c080 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1c090 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1c0a0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1c0b0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1c0c0 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1c0d0 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1c0e0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1c0f0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1c100 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1c110 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1c120 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1c130 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1c140 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1c150 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1c160 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c170 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1c180 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1c190 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1c1a0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1c1b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c1c0 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1c1d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c1e0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c1f0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c200 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c210 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c220 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c230 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1c240 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1c250 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1c260 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1c270 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1c280 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1c290 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1c2a0 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1c2b0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1c2c0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1c2d0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1c2e0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1c2f0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c300 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1c310 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c320 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1c330 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1c340 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1c350 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c370 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c380 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c390 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c3a0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c3b0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c3c0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c3d0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c3e0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c3f0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c400 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c410 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c420 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c430 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c440 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c450 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1c460 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1c470 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1c480 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1c490 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1c4a0 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1c4b0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1c4c0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c4d0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1c4e0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1c4f0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1c500 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1c510 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1c520 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c530 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1c540 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c550 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c560 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c570 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1c580 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1c590 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c5a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c5b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c5c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c5d0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1c5e0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1c5f0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1c600 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1c610 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1c620 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1c630 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1c640 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1c650 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1c660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c670 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1c680 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1c690 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1c6a0 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1c6b0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1c6c0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1c6d0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1c6e0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1c6f0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1c700 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1c710 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c720 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1c730 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1c740 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c750 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c760 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1c770 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1c780 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1c790 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c7a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c7b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c7d0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1c7e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1c7f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c810 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c820 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1c830 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c840 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1c850 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1c860 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c870 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1c880 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1c890 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1c8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c8b0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c8c0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1c8d0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1c8e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1c8f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c900 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1c910 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1c920 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1c930 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1c940 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1c950 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1c960 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1c970 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1c980 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1c990 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1c9a0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1c9b0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1c9c0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1c9d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1c9e0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1c9f0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1ca00 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1ca10 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1ca20 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1ca30 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1ca40 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ca50 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1ca60 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ca70 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1ca80 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ca90 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1caa0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1cab0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1cac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1cad0 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1cae0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1caf0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1cb00 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1cb10 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1cb20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1cb30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1cb40 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1cb50 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1cb60 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1cb70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1cb80 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1cb90 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cba0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1cbb0 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1cbc0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1cbd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1cbe0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1cbf0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1cc00 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1cc10 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1cc20 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1cc30 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1cc40 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1cc50 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1cc60 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1cc70 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1cc80 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1cc90 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1cca0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1ccb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1ccc0 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1ccd0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1cce0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1ccf0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1cd00 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1cd10 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1cd20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1cd30 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1cd40 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1cd50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1cd60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1cd70 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1cd80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1cd90 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1cda0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1cdb0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1cdc0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1cdd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1cde0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1cdf0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1ce00 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1ce10 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1ce20 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1ce30 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1ce40 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1ce50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ce60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1ce70 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1ce80 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1ce90 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1cea0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1ceb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cec0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ced0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1cee0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1cef0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1cf00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cf10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1cf20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1cf30 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1cf40 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1cf50 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1cf60 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1cf70 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1cf80 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1cf90 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1cfa0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1cfb0 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1cfc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1cfd0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1cfe0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1cff0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1d000 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1d010 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d020 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1d030 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1d040 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1d050 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1d060 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1d070 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1d080 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1d090 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1d0a0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d0b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d0c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d0d0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d0e0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1d0f0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1d100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d120 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d130 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1d150 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1d160 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1d170 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1d190 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1d1a0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1d1b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d1c0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1d1d0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1d1e0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d1f0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1d200 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1d210 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1d220 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d230 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d240 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1d250 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1d260 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1d270 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d280 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d290 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1d2a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d2b0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1d2c0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1d2d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d2e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d2f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d300 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1d310 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1d320 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1d330 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1d340 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1d350 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d360 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d370 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d380 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d390 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d3a0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d3b0 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d3c0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d3d0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d3e0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d3f0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d400 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d410 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d420 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d430 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d440 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d450 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1d460 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1d470 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1d480 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1d490 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1d4a0 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1d4b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d4c0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d4d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1d4e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1d4f0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1d500 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1d510 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d530 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d540 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1d550 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d570 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d580 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d590 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1d5a0 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1d5b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d5c0 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1d5d0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1d5e0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1d5f0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1d600 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1d610 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1d620 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1d630 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d660 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d680 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1d690 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1d6a0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1d6b0 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1d6c0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1d6d0 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1d6e0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d6f0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1d700 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1d710 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1d720 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1d730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d740 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d750 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1d760 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1d770 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1d780 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1d790 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1d7a0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1d7b0 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1d7c0 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1d7d0 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1d7e0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1d7f0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1d800 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1d810 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1d820 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1d830 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1d840 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1d850 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1d860 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1d870 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1d880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d890 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1d8a0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1d8b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1d8c0 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1d8d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d8e0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1d8f0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1d900 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1d930 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1d940 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d950 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1d960 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1d970 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1d980 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1d990 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1d9a0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1d9b0 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1d9c0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1d9d0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1d9e0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1d9f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1da00 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1da10 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1da20 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1da30 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1da40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1da50 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1da60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1da70 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1da80 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1da90 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1daa0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1dab0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1dac0 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1dad0 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1dae0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1daf0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1db00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1db10 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1db20 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1db30 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1db40 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1db50 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1db60 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1db70 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1db80 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1db90 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1dba0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1dbb0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1dbc0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1dbd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1dbe0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1dbf0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1dc00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1dc10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1dc20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1dc30 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1dc40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1dc50 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1dc60 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1dc70 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1dc80 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1dc90 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1dca0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1dcb0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1dcc0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1dcd0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1dce0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1dcf0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1dd00 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1dd10 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1dd20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1dd30 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1dd40 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1dd50 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1dd60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1dd70 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1dd80 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1dd90 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1dda0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1ddb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1ddc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ddd0 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1dde0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1ddf0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1de00 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1de10 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1de20 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1de30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1de40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1de50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1de60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1de70 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1de80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1de90 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1dea0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1deb0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1dec0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1ded0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dee0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1def0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1df00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1df10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1df20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1df30 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1df40 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1df50 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1df60 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1df70 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1df80 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1df90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1dfa0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dfb0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1dfc0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1dfd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1dfe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dff0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1e000 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1e010 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1e020 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1e030 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1e040 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1e050 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1e060 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1e070 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1e080 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1e090 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1e0a0 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1e0b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1e0c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e0d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e0e0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1e0f0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1e100 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e110 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1e120 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e130 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e140 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1e150 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e160 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e170 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1e180 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1e190 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1e1a0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1e1b0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1e1c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e1d0 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1e1e0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1e1f0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1e200 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1e210 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e220 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1e230 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1e240 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1e250 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1e260 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1e270 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1e280 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e290 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1e2a0 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1e2b0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e2c0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e2d0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1e2e0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1e2f0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1e300 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e310 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1e320 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1e330 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1e340 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1e350 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e360 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e370 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e380 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e390 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e3a0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e3b0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e3c0 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e3d0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e3e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e3f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e410 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e420 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e430 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e440 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e450 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1e460 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1e470 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1e480 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e490 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1e4a0 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1e4b0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1e4c0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1e4d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1e4e0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1e4f0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1e500 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1e510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1e520 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e530 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1e540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e550 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e560 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1e570 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1e580 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e590 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e5a0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e5b0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1e5c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e5d0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1e5e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e5f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e600 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1e610 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e620 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e630 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1e640 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1e650 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1e660 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1e670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e690 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e6a0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1e6b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1e6c0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1e6d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1e6e0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1e6f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1e700 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1e710 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e720 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1e730 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1e740 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1e750 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e760 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1e770 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1e780 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1e790 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1e7a0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1e7b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e7c0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1e7d0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1e7e0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1e7f0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1e800 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1e810 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1e820 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1e830 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1e840 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1e850 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1e860 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1e870 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1e880 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1e890 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1e8a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1e8b0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1e8c0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1e8d0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1e8e0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1e8f0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1e900 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1e910 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1e920 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1e930 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1e940 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1e950 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1e960 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1e970 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1e980 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1e990 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1e9a0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1e9b0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1e9c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e9d0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1e9e0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1e9f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ea00 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1ea10 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1ea20 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1ea30 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1ea40 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1ea50 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1ea60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1ea70 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1ea80 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1ea90 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1eaa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1eab0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1eac0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1ead0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1eae0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1eaf0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1eb00 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1eb10 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1eb20 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1eb30 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1eb40 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1eb50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1eb60 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1eb70 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1eb80 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1eb90 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1eba0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1ebb0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1ebc0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1ebd0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1ebe0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1ebf0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1ec00 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1ec10 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1ec20 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1ec30 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1ec40 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1ec50 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1ec60 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1ec70 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1ec80 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1ec90 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1eca0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1ecb0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ecc0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1ecd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1ece0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1ecf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ed00 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1ed10 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ed20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ed30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1ed40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1ed50 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1ed60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ed70 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1ed80 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ed90 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1eda0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1edb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1edc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1edd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ede0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1edf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ee00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ee10 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1ee20 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1ee30 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1ee40 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1ee50 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1ee60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ee70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ee80 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ee90 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1eea0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1eeb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1eec0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1eed0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1eee0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1eef0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1ef00 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1ef10 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1ef20 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1ef30 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1ef40 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1ef50 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ef60 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1ef70 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1ef80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ef90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1efa0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1efb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1efc0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1efd0 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1efe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1eff0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1f000 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1f010 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1f020 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1f030 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1f040 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1f050 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1f060 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1f070 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1f080 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1f090 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1f0a0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1f0b0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f0c0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1f0d0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1f0e0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1f0f0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1f100 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1f110 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1f120 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f130 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1f140 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f150 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1f160 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1f170 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1f180 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1f190 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1f1a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1f1b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1f1c0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1f1d0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1f1e0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1f1f0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1f200 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1f210 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1f220 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1f230 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1f240 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1f250 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1f260 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1f270 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1f280 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1f290 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1f2a0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f2b0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1f2c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1f2d0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1f2e0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1f2f0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1f300 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1f310 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1f320 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f330 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1f340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1f350 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f360 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f370 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f380 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f390 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f3a0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f3b0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f3c0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f3d0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f3e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f3f0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f400 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f410 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f430 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f440 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f450 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1f460 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1f470 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1f480 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1f490 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1f4a0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1f4b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1f4c0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1f4d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1f4e0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1f4f0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1f500 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1f510 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f520 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1f530 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1f540 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1f550 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1f560 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1f570 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1f580 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1f590 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1f5a0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1f5b0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1f5c0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1f5d0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1f5e0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1f5f0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1f600 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1f610 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1f620 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1f630 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1f640 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1f650 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1f660 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1f670 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1f680 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1f690 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1f6a0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1f6b0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1f6c0 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1f6d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1f6e0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1f6f0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1f700 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1f710 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1f720 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1f730 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1f740 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1f750 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1f760 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1f770 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1f780 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1f790 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1f7a0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1f7b0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1f7c0 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1f7d0 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1f7e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1f7f0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1f800 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1f810 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1f820 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1f830 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1f840 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1f850 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1f860 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1f870 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1f880 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1f890 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1f8a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1f8b0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1f8c0 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1f8d0 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1f8e0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1f8f0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1f900 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1f910 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1f920 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1f930 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f940 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1f950 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1f960 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1f970 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1f980 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1f990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f9a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f9b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1f9c0 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1f9d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1f9e0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1f9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1fa00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1fa10 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1fa20 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1fa30 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1fa40 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1fa50 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1fa60 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1fa70 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1fa80 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1fa90 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1faa0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1fab0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1fac0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1fad0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1fae0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1faf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1fb00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1fb10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1fb20 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1fb30 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1fb40 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1fb50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fb60 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1fb70 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1fb80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fb90 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1fba0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1fbb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1fbc0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1fbd0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1fbe0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
1fbf0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
1fc00 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
1fc10 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
1fc20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1fc30 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1fc40 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1fc50 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1fc60 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1fc70 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1fc80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1fc90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1fca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fcb0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1fcc0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1fcd0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1fce0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1fcf0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1fd00 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1fd10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1fd20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1fd30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1fd40 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1fd50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fd60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fd70 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1fd80 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1fd90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fda0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fdb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1fdc0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1fdd0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1fde0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1fdf0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1fe00 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1fe10 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1fe20 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1fe30 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1fe40 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1fe50 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1fe60 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1fe70 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1fe80 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1fe90 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1fea0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1feb0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1fec0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1fed0 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1fee0 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1fef0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1ff00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1ff10 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1ff20 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1ff30 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1ff40 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1ff50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ff60 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1ff70 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1ff80 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1ff90 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1ffa0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1ffb0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1ffc0 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1ffd0 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1ffe0 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1fff0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
20000 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
20010 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
20020 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
20030 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
20040 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20050 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
20060 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
20070 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
20080 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
20090 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
200a0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
200b0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
200c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
200d0 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
200e0 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
200f0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
20100 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
20110 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
20120 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
20130 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
20140 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
20150 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
20160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
20170 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
20180 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
20190 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
201a0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
201b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
201c0 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
201d0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
201e0 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
201f0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
20200 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
20210 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
20220 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20230 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
20240 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
20250 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
20260 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
20270 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
20280 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
20290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
202a0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
202b0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
202c0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
202d0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
202e0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
202f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20300 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
20310 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
20320 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
20330 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
20340 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
20350 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
20360 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
20370 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
20380 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
20390 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
203a0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
203b0 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
203c0 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
203d0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
203e0 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
203f0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
20400 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20410 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
20420 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
20430 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20440 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
20450 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
20460 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20480 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
20490 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
204a0 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
204b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
204c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
204d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
204e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
204f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20500 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
20510 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
20520 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
20530 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
20540 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
20550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20560 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
20570 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20580 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
20590 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
205a0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
205b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
205c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
205d0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
205e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
205f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
20600 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
20610 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
20620 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
20630 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
20640 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
20650 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20660 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20670 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20680 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20690 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
206a0 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
206b0 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
206c0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
206d0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
206e0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
206f0 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
20700 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
20710 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
20720 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
20730 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
20740 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
20750 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20760 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20770 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20780 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20790 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
207a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
207b0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
207c0 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
207d0 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
207e0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
207f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20800 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
20810 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
20820 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
20830 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
20840 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20850 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20860 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20870 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20880 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20890 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
208a0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
208b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
208c0 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
208d0 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
208e0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
208f0 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
20900 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
20910 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
20920 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
20930 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
20940 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
20950 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20960 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20970 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20980 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20990 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
209a0 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
209b0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
209c0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
209d0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
209e0 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
209f0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
20a00 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
20a10 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
20a20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
20a30 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
20a40 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
20a50 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
20a60 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
20a70 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
20a80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20a90 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20aa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
20ab0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
20ac0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
20ad0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
20ae0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
20af0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
20b00 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
20b10 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
20b20 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
20b30 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
20b40 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
20b50 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
20b60 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
20b70 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
20b80 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
20b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
20ba0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
20bb0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
20bc0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
20bd0 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
20be0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
20bf0 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
20c00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20c10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
20c20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
20c30 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
20c40 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
20c50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
20c60 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
20c70 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
20c80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20c90 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
20ca0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
20cb0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
20cc0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
20cd0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
20ce0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
20cf0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
20d00 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
20d10 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
20d20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20d30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20d40 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
20d50 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20d60 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
20d70 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
20d80 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
20d90 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
20da0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
20db0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
20dc0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
20dd0 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
20de0 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
20df0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
20e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
20e10 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
20e20 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
20e30 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
20e40 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
20e50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
20e60 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20e70 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
20e80 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
20e90 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
20ea0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
20eb0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
20ec0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
20ed0 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
20ee0 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
20ef0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
20f00 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
20f10 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
20f20 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
20f30 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
20f40 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20f50 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
20f60 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
20f70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
20f80 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
20f90 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
20fa0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
20fb0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20fc0 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
20fd0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
20fe0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
20ff0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
21000 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
21010 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
21020 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
21030 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
21040 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
21050 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
21060 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
21070 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
21080 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
21090 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
210a0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
210b0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
210c0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
210d0 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
210e0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
210f0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
21100 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21110 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
21120 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21130 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
21140 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
21150 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
21160 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21170 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
21180 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
211a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
211b0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
211c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
211d0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
211e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
211f0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
21200 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
21210 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
21220 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
21230 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
21240 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
21250 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
21260 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
21270 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21280 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
21290 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
212a0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
212b0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
212c0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
212d0 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
212e0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
212f0 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
21300 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
21310 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
21320 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
21330 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
21340 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
21350 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
21360 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
21370 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
21380 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
21390 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
213a0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
213b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
213c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
213d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
213e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
213f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
21400 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
21410 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21420 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
21430 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
21440 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
21450 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
21460 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
21470 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
21480 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
21490 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
214a0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
214b0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
214c0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
214d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
214e0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
214f0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
21500 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
21510 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21520 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
21530 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
21540 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
21550 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
21560 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
21570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
21580 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
21590 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
215a0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
215b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
215c0 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
215d0 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
215e0 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
215f0 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
21600 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
21610 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21620 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
21630 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
21640 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
21650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21660 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21670 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21680 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21690 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
216a0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
216b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
216c0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
216d0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
216e0 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
216f0 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
21700 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
21710 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21720 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
21730 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21740 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21750 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21760 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21770 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21780 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
217a0 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
217b0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
217c0 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
217d0 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
217e0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
217f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21800 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
21810 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
21820 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
21830 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
21840 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21850 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21860 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21870 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21880 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21890 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
218a0 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
218b0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
218c0 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
218d0 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
218e0 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
218f0 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
21900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
21910 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
21920 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21930 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
21940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21950 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21960 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21970 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21980 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21990 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
219a0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
219b0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
219c0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
219d0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
219e0 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
219f0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
21a00 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
21a10 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
21a20 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
21a30 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
21a40 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
21a50 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
21a60 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
21a70 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
21a80 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
21a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
21aa0 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
21ab0 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
21ac0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21ad0 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
21ae0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
21af0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
21b00 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
21b10 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
21b20 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
21b30 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
21b40 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
21b50 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
21b60 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
21b70 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
21b80 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
21b90 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
21ba0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
21bb0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
21bc0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
21bd0 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
21be0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
21bf0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
21c00 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
21c10 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
21c20 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
21c30 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
21c40 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
21c50 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
21c60 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
21c70 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
21c80 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
21c90 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
21ca0 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
21cb0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
21cc0 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
21cd0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
21ce0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
21cf0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
21d00 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
21d10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
21d20 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
21d30 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
21d40 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
21d50 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
21d60 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
21d70 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
21d80 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
21d90 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
21da0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
21db0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
21dc0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
21dd0 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
21de0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
21df0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
21e00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
21e10 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
21e20 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
21e30 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
21e40 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
21e50 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
21e60 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
21e70 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
21e80 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
21e90 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
21ea0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
21eb0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
21ec0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
21ed0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
21ee0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21f10 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
21f20 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f40 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
21f50 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
21f60 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
21f90 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
21fa0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
21fb0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
21fc0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
21fd0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
21fe0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
21ff0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
22000 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
22030 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
22040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
22050 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
22060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
22070 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
22080 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
22090 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220b0 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
220c0 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
220d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
220e0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
220f0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
22100 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
22110 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
22120 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
22130 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
22140 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
22150 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
22160 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
22170 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
22180 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
22190 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
221a0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
221b0 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
221c0 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
221d0 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
221e0 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
221f0 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
22200 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
22210 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
22220 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
22230 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
22240 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
22250 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
22260 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
22270 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
22280 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
22290 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
222a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
222b0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
222c0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
222d0 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
222e0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
222f0 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
22300 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
22310 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
22320 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
22330 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
22340 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
22350 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
22360 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
22370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22380 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
22390 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
223a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
223b0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
223c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
223d0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
223e0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
223f0 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
22400 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
22410 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
22420 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
22430 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22440 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
22450 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
22460 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
22470 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
22480 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
22490 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
224a0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
224b0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
224c0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
224d0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
224e0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
224f0 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
22500 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
22510 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
22520 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
22530 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
22540 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
22550 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
22560 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
22570 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
22580 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
22590 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
225a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
225b0 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
225c0 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
225d0 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
225e0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
225f0 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
22600 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
22610 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
22620 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
22630 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
22640 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
22650 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
22660 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
22670 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
22680 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
22690 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
226a0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
226b0 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
226c0 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
226d0 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
226e0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
226f0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
22700 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
22710 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
22720 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
22730 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
22740 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
22750 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
22760 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
22770 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
22780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22790 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
227a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
227b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
227f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22820 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22830 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22840 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22870 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22880 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
22890 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
228a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
228b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
228c0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
228d0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
228e0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
22910 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
22920 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
22930 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
22940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22950 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
22960 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
22970 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22980 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
22990 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
229a0 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
229b0 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
229c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
229d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
229e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
229f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
22a00 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
22a10 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
22a20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
22a30 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
22a40 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
22a50 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
22a60 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
22a70 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
22a80 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
22a90 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
22aa0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
22ab0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
22ac0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
22ad0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
22ae0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
22af0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
22b00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22b10 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
22b20 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
22b30 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
22b40 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
22b50 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
22b60 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
22b70 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
22b80 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
22b90 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
22ba0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
22bb0 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
22bc0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
22bd0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
22be0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
22bf0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
22c00 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
22c10 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
22c20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
22c30 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
22c40 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
22c50 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
22c60 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
22c70 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
22c80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
22c90 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
22ca0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
22cb0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
22cc0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
22cd0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
22ce0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
22cf0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
22d00 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
22d10 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
22d20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22d30 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
22d40 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
22d50 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
22d60 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
22d70 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
22d80 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
22d90 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
22da0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
22db0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
22dc0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
22dd0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
22de0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
22df0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22e00 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
22e10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22e20 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
22e30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22e40 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
22e50 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
22e60 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
22e70 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
22e80 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
22e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22ea0 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
22eb0 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
22ec0 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
22ed0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
22ee0 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
22ef0 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
22f00 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
22f10 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
22f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
22f30 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
22f40 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
22f50 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
22f60 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
22f70 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
22f80 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
22f90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
22fa0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
22fb0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
22fc0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
22fd0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
22fe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22ff0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
23000 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
23010 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
23020 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
23030 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
23040 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
23060 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
23070 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
23080 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
23090 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
230a0 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
230b0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
230c0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
230d0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
230e0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
230f0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
23100 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
23110 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
23120 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
23130 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
23140 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
23150 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
23160 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
23170 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
23180 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
23190 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
231a0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
231b0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
231c0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
231d0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
231e0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
231f0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
23200 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
23210 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
23220 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
23230 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
23240 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
23250 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
23260 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
23270 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
23280 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
23290 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
232a0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
232b0 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
232c0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
232d0 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54  dif.static SQLIT
232e0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
232f0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
23300 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
23310 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
23320 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ize==0 ){.    in
23330 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
23340 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d  iPage;.    pCur-
23350 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
23360 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
23370 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23380 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
23390 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
233a0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
233b0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
233c0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
233d0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
233e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
233f0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
23400 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
23410 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
23420 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
23430 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
23440 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
23450 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
23460 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
23470 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
23480 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23490 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
234a0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
234b0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
234c0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
234d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
234e0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
234f0 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
23500 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23510 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
23520 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23530 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
23540 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23550 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
23560 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
23570 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
23580 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
23590 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
235a0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
235b0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
235c0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
235d0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
235e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
235f0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
23600 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
23610 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
23620 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
23630 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
23640 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
23650 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
23660 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
23670 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
23680 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23690 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
236a0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
236b0 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
236c0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
236d0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
236e0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
236f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
23700 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
23710 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
23720 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
23730 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
23740 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
23750 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
23760 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23770 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23790 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
237a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
237b0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
237c0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
237d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
237e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
237f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
23800 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
23810 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
23820 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
23830 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
23840 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
23850 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
23860 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
23870 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
23880 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
23890 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
238a0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
238b0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
238c0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
238d0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
238e0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
238f0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
23900 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
23910 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
23920 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
23930 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
23940 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
23950 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
23960 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
23970 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
23980 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
23990 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
239a0 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
239b0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
239c0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
239d0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
239e0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
239f0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
23a00 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23a10 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
23a20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23a30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23a50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23a60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23a70 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23a80 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
23a90 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23aa0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
23ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23ac0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23ad0 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
23ae0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
23af0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23b00 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
23b10 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
23b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
23b40 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
23b50 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
23b60 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
23b70 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
23b80 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
23b90 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
23ba0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
23bb0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
23bc0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
23bd0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
23be0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
23bf0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
23c00 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
23c10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
23c20 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
23c30 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
23c40 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
23c50 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
23c60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23c70 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
23c80 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
23c90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
23ca0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
23cb0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
23cc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23cd0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
23ce0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
23cf0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
23d00 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
23d10 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
23d20 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
23d30 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
23d40 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
23d50 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
23d60 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
23d70 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
23d80 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
23d90 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
23da0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
23db0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
23dc0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
23dd0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
23de0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
23df0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
23e00 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
23e10 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
23e20 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
23e30 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
23e40 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
23e50 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
23e60 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
23e70 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
23e80 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
23e90 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
23ea0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
23eb0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
23ec0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
23ed0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
23ee0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
23ef0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
23f00 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
23f10 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
23f20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23f30 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
23f40 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
23f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23f60 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
23f70 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
23f80 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
23f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23fa0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
23fb0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
23fc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
23fd0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
23fe0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
23ff0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
24000 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
24010 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
24020 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
24030 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24040 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
24050 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24060 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
24070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
24080 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
24090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
240a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
240b0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
240c0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
240d0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
240e0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
240f0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
24100 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
24110 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
24120 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
24130 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
24140 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
24150 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
24160 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
24170 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
24180 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
24190 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
241a0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
241b0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
241c0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
241d0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
241e0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
241f0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
24200 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
24210 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
24220 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
24230 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
24240 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
24250 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
24260 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
24270 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
24280 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
24290 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
242a0 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
242b0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
242c0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
242d0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
242e0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
242f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24300 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
24310 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
24320 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
24330 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
24340 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
24350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
24360 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
24370 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24380 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
24390 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
243a0 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
243b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
243c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
243d0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
243e0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
243f0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
24400 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
24410 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
24420 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
24430 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
24440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24450 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
24460 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
24470 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
24480 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
24490 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
244a0 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
244b0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
244c0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
244d0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
244e0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
244f0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
24500 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
24510 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
24520 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
24530 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
24540 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
24550 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
24560 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
24570 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
24580 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
24590 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
245a0 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
245b0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
245c0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
245d0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
245e0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
245f0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
24600 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
24610 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
24620 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
24630 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
24640 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
24650 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
24660 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24670 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
24680 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
24690 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
246a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
246b0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
246c0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
246d0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
246e0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
246f0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
24700 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
24710 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
24720 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
24730 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
24740 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24750 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
24760 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
24770 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24780 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
24790 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
247c0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
247d0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
247e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
247f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24800 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
24810 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
24820 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
24830 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24840 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
24850 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
24860 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
24870 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24880 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
248a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
248b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
248c0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
248d0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
248e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
248f0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
24900 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
24910 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
24920 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
24930 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
24940 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
24950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24970 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24980 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
24990 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
249a0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
249b0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
249c0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
249d0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
249e0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
249f0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
24a00 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
24a10 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24a20 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24a30 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24a40 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24a50 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24a60 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24a70 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24a80 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24a90 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
24aa0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
24ab0 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
24ac0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24ad0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
24ae0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
24af0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
24b00 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
24b10 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
24b20 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
24b30 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
24b40 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
24b50 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
24b60 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
24b70 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
24b80 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
24b90 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
24ba0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
24bb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
24bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
24bd0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
24be0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
24bf0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
24c00 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
24c10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
24c20 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
24c30 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
24c40 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
24c50 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
24c60 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
24c70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
24c80 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
24c90 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
24ca0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
24cb0 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
24cc0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
24cd0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
24ce0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
24cf0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
24d00 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
24d10 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
24d20 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
24d30 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
24d40 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
24d50 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
24d60 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
24d70 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
24d80 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
24d90 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
24da0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
24db0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
24dc0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
24dd0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
24de0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
24df0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
24e00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
24e10 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
24e20 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
24e30 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
24e40 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
24e50 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
24e60 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
24e70 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
24e80 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
24e90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
24ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
24eb0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
24ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24ed0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
24ee0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
24ef0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
24f00 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
24f10 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
24f20 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
24f30 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
24f40 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
24f50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
24f60 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
24f70 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
24f80 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
24f90 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
24fa0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
24fb0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
24fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
24fd0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
24fe0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
24ff0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
25000 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
25010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25020 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
25030 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25040 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25050 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25060 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
25070 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
25080 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
25090 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
250a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
250b0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
250c0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
250d0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
250e0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
250f0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
25100 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
25110 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
25120 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25150 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
25160 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
25170 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
25180 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
25190 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
251a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
251b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
251c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
251d0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
251e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
251f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25200 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25210 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
25220 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
25230 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
25240 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
25250 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
25260 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
25270 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
25280 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
25290 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
252a0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
252b0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
252c0 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
252d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
252e0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
252f0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
25300 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
25310 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
25320 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
25330 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
25340 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
25350 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
25360 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
25370 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
25380 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
25390 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
253a0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
253b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
253c0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
253d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
253e0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
253f0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
25400 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
25410 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
25420 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
25430 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
25440 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
25450 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
25460 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
25470 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
25480 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
25490 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
254a0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
254b0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
254c0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
254d0 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
254e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
254f0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
25500 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
25510 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
25520 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
25530 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25540 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
25550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25560 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
25570 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
25580 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25590 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
255a0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
255b0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
255c0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
255d0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
255e0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
255f0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
25600 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
25610 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
25620 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
25630 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
25640 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
25650 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
25660 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
25670 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
25680 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
25690 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
256a0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
256b0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
256c0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
256d0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
256e0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
256f0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
25700 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
25710 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
25720 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
25730 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
25740 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
25750 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
25760 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25770 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
25780 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
25790 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
257a0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
257b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
257c0 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
257d0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
257e0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
257f0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
25800 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
25810 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
25820 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
25830 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
25840 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
25850 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
25860 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
25870 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
25880 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
25890 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
258a0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
258b0 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
258c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
258d0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
258e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
258f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25910 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
25920 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
25930 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
25940 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
25950 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
25960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25970 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25980 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
25990 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
259a0 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
259b0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
259c0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
259d0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
259e0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
259f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
25a00 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25a10 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25a20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
25a30 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
25a40 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
25a50 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
25a60 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
25a70 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
25a80 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
25a90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
25aa0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25ab0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
25ac0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
25ad0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
25ae0 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
25af0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
25b00 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
25b10 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
25b20 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
25b30 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
25b40 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
25b50 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
25b60 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
25b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25b80 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
25b90 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
25ba0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
25bb0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
25bc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
25bd0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
25be0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
25bf0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25c00 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
25c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
25c20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25c30 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
25c40 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
25c50 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
25c60 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
25c70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
25c80 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
25c90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
25ca0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
25cb0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
25cc0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
25cd0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
25ce0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
25cf0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
25d00 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
25d10 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
25d20 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
25d30 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
25d40 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
25d50 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
25d60 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
25d70 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
25d80 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
25d90 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
25da0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
25db0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
25dc0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
25dd0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
25de0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
25df0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
25e00 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
25e10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25e20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
25e30 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
25e40 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
25e50 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
25e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
25e70 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
25e80 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
25e90 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
25ea0 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
25eb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25ec0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
25ed0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25ee0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
25ef0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
25f00 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
25f10 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
25f20 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
25f30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
25f40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25f50 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
25f60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
25f70 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25f80 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
25f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25fa0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
25fb0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
25fc0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
25fd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25fe0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
25ff0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26010 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
26020 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26030 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26040 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26050 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26060 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26070 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
26080 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
26090 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
260a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
260b0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
260c0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
260d0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
260e0 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
260f0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
26100 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
26110 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
26120 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
26130 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
26140 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
26150 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26160 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26170 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
26180 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
26190 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
261a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
261b0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
261c0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
261d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
261e0 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
261f0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
26200 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
26210 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
26220 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
26230 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
26240 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
26250 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
26260 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
26270 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
26280 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26290 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
262a0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
262b0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
262c0 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
262d0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
262e0 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
262f0 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
26300 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
26310 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
26320 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
26330 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
26340 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26350 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
26360 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
26370 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
26380 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
26390 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
263a0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
263b0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
263c0 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
263d0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
263e0 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
263f0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
26400 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
26410 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26420 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26430 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26440 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
26470 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26480 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
264c0 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
264d0 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26500 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26510 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26520 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26530 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26540 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26550 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
26560 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
26570 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
26580 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
26590 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
265a0 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
265b0 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
265c0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
265d0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
265e0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
265f0 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26600 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26630 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26640 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26650 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
26660 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
26670 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26680 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
26690 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
266b0 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
266c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
266d0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
266e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
266f0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26700 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26710 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26720 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26730 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26740 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26750 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
26760 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
26770 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
26780 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26790 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
267a0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
267b0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
267c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
267d0 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
267e0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
267f0 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
26800 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
26810 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
26820 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26830 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
26840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26860 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
26870 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
26880 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
26890 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
268a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
268b0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
268c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
268d0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
268e0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
268f0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
26900 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
26910 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26920 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
26930 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26940 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
26950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
26970 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
26980 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
26990 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
269a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
269b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
269c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
269d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
269e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
269f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
26a00 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
26a10 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
26a20 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
26a30 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
26a40 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
26a50 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
26a60 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
26a70 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
26a80 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
26a90 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
26aa0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
26ab0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
26ac0 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
26ad0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
26ae0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26af0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
26b00 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
26b10 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
26b20 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
26b30 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
26b40 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
26b50 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
26b60 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
26b70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
26b80 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
26b90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
26ba0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
26bb0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
26bc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26bd0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26be0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26bf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26c00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26c10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26c20 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26c30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26c40 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
26c50 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26c60 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
26c70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26c80 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
26c90 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
26ca0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
26cb0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
26cc0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
26cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
26ce0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
26cf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26d00 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26d10 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26d20 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26d30 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
26d40 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
26d50 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
26d60 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
26d70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
26d80 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
26d90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
26da0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
26db0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
26dc0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
26dd0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
26de0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
26df0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
26e00 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
26e10 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
26e20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
26e30 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
26e40 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
26e50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
26e60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26e70 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
26e80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26e90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
26ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26eb0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
26ec0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
26ed0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26ee0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
26ef0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
26f00 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
26f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26f20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26f30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26f40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26f50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26f60 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26f70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26f80 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
26f90 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26fa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26fb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26fc0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26fd0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
26fe0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
26ff0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
27000 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
27010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27020 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
27030 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
27040 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
27050 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
27060 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
27070 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
27080 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
27090 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
270a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
270b0 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
270c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
270d0 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
270e0 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
270f0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
27100 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
27110 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
27120 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
27130 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
27140 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
27150 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
27160 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
27170 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
27180 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
27190 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
271a0 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
271b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
271c0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
271d0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
271e0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
271f0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
27200 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
27210 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
27220 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
27230 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
27240 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
27250 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
27260 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
27270 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
27280 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
27290 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
272a0 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
272b0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
272c0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
272d0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
272e0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
272f0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
27300 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
27310 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
27320 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
27330 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
27340 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
27350 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
27360 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
27370 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
27380 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
27390 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
273a0 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
273b0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
273c0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
273d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
273e0 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
273f0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
27400 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27410 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
27420 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
27430 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
27440 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
27450 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
27460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27470 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
27480 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
27490 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
274a0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
274b0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
274c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
274d0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
274e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
274f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27510 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27520 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27530 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27540 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27550 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27560 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27570 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27580 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27590 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
275a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
275b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
275c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
275d0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
275e0 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
275f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27600 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
27610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27620 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27630 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
27640 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27650 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
27660 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
27670 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
27680 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27690 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
276a0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
276b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
276c0 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
276d0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
276e0 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
276f0 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
27700 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
27710 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
27720 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
27730 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
27740 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
27750 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
27760 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
27770 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
27780 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
27790 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
277a0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
277b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
277c0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
277d0 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
277e0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
277f0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
27800 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
27810 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
27820 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
27830 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
27840 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
27850 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
27860 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
27870 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
27880 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
27890 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
278a0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
278b0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
278c0 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
278d0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
278e0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
278f0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
27900 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
27910 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
27920 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
27930 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
27940 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
27950 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
27960 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
27970 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
27980 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
27990 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
279a0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
279b0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
279c0 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
279d0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
279e0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
279f0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
27a00 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
27a10 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
27a20 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
27a30 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
27a40 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
27a50 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
27a60 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
27a70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
27a80 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
27a90 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
27aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
27ab0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
27ac0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
27ad0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
27ae0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
27af0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
27b00 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
27b10 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
27b20 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
27b30 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
27b40 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
27b50 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
27b60 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
27b70 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
27b80 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
27b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
27ba0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
27bb0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
27bc0 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
27bd0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
27be0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
27bf0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27c00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27c10 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27c20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27c30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27c40 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
27c50 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
27c60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27c70 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
27c80 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
27c90 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
27ca0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
27cb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27cc0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
27cd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
27ce0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
27cf0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
27d00 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27d10 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
27d20 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d  iPage++;.  pCur-
27d30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27d40 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge] = 0;.  retur
27d50 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
27d60 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
27d70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27d80 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
27db0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
27dc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
27dd0 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
27de0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
27df0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
27e00 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
27e10 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
27e20 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
27e30 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
27e40 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
27e50 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
27e60 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
27e70 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
27e80 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
27e90 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
27ea0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
27eb0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
27ec0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
27ed0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
27ee0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
27ef0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
27f00 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
27f10 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
27f20 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
27f30 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
27f40 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
27f50 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
27f60 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
27f70 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
27f80 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
27fb0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
27fc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
27fd0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
27fe0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
27ff0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
28000 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
28010 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
28020 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
28030 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
28040 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
28050 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
28060 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
28070 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
28080 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
28090 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
280a0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
280b0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
280c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
280d0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
280e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
280f0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
28100 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
28110 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
28120 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
28130 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
28140 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
28150 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
28160 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
28170 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
28180 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
28190 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
281a0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
281b0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
281c0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
281d0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
281e0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
281f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
28200 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28210 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28220 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28230 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28240 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
28250 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
28260 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28270 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28280 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
28290 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
282a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
282b0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
282c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
282d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
282e0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
282f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
28300 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
28310 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
28320 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
28330 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
28340 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
28350 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
28360 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28370 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28380 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
28390 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
283a0 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  vfl);.  releaseP
283b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
283c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
283d0 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
283e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
283f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
28400 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
28410 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
28420 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
28430 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
28440 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
28450 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
28460 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
28470 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
28480 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
28490 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
284a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
284b0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
284c0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
284d0 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
284e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
284f0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
28500 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
28510 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
28520 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
28530 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
28540 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
28550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
28560 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
28570 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
28580 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
28590 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
285a0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
285b0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
285c0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
285d0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
285e0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
285f0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
28600 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
28610 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
28620 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
28630 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
28640 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
28650 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
28660 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
28670 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
28680 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
28690 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
286a0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
286b0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
286c0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
286d0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
286e0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
286f0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
28700 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
28710 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
28720 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
28730 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
28740 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28750 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
28760 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
28770 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
28780 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
28790 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
287a0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
287b0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
287c0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
287d0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
287e0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
287f0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
28800 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28810 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
28820 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
28830 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
28840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
28870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
28880 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
28890 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
288a0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
288b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
288c0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
288d0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
288e0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
288f0 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
28900 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
28910 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
28920 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28930 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
28940 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
28950 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
28960 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
28970 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
28980 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28990 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
289a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
289b0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
289c0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
289d0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
289e0 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
289f0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
28a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28a10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28a20 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20  >iPage]!=0 );.  
28a30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
28a40 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
28a50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28a60 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -]);.    }.  }el
28a70 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
28a80 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
28a90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28aa0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
28ab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28ac0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28ad0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28ae0 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
28af0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
28b00 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
28b10 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
28b20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
28b30 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
28b60 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
28b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
28b90 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28ba0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
28bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28bc0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
28bd0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
28be0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
28bf0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
28c00 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
28c10 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
28c20 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
28c30 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
28c40 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
28c50 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
28c60 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
28c70 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
28c80 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
28c90 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
28ca0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
28cb0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
28cc0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
28cd0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
28ce0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
28cf0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
28d00 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
28d10 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
28d20 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
28d30 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
28d40 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
28d50 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
28d60 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
28d70 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
28d80 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
28d90 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
28da0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
28db0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
28dc0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
28dd0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
28de0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
28df0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
28e00 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
28e10 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
28e20 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
28e30 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
28e40 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
28e50 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
28e60 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
28e70 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
28e80 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
28e90 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28ea0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
28eb0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
28ec0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
28ed0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
28ee0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
28ef0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
28f00 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
28f10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28f20 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
28f30 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
28f40 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
28f50 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28f60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28f70 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
28f80 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28f90 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
28fa0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
28fb0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
28fc0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28fd0 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
28fe0 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
28ff0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
29000 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
29010 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
29020 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29030 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
29040 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
29050 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
29060 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
29070 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
29080 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
29090 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
290a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
290b0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
290c0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
290d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
290e0 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
290f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29100 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29110 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
29120 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29130 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29140 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
29150 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
29160 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
29170 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
29180 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
29190 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
291a0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
291b0 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
291c0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
291d0 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
291e0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
291f0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
29200 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29210 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
29220 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
29230 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29240 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29260 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29270 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29290 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
292a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
292b0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
292c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
292d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
292e0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
292f0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
29300 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
29310 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
29320 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29330 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
29340 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29350 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
29360 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29370 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29380 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
29390 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
293a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
293b0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
293c0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
293d0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
293e0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
293f0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29400 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29410 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29420 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29430 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29440 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29450 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29460 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29470 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29480 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29490 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
294a0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
294b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
294c0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
294d0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
294e0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
294f0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29500 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29510 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29520 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29530 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29540 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29560 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29570 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29580 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29590 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
295a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
295b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
295c0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
295d0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
295e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
295f0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29600 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
29610 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29620 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29630 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
29640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29650 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29660 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
29670 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29680 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
29690 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
296a0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
296b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
296c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
296d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
296e0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
296f0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29700 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29710 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
29720 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29730 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
29740 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29750 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
29760 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
29770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
29780 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
29790 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
297a0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
297b0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
297c0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
297d0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
297e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
297f0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
29800 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
29810 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29820 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29830 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
29840 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29850 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29860 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29870 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
29880 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
29890 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
298a0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
298b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
298c0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
298d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
298e0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
298f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29900 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29920 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29930 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29940 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
29950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29970 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
29980 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29990 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
299a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
299b0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
299c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
299d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
299e0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
299f0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
29a00 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
29a10 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
29a20 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
29a30 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
29a40 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
29a50 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
29a60 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
29a70 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
29a80 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
29a90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
29aa0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
29ab0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29ac0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
29ad0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29ae0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29af0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29b00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
29b10 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
29b20 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
29b30 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
29b40 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
29b50 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
29b60 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
29b70 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
29b80 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
29b90 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
29ba0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
29bb0 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
29bc0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29bd0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
29be0 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
29bf0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
29c00 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
29c10 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
29c20 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
29c30 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
29c40 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
29c50 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
29c60 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
29c70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29c80 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
29c90 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
29ca0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
29cb0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
29cc0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29cd0 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
29ce0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29cf0 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
29d00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29d10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29d20 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
29d30 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
29d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29d50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
29d60 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
29d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29d80 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
29d90 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
29da0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
29db0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
29dc0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
29dd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29de0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
29df0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29e00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29e10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29e20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29e30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
29e40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
29e50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
29e60 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
29e70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29e90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
29ea0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
29eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29ec0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
29ed0 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
29ee0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
29ef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
29f10 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
29f20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
29f30 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
29f40 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
29f50 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
29f60 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
29f70 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
29f80 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
29f90 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
29fa0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
29fb0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
29fc0 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
29fd0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
29fe0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
29ff0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2a000 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2a010 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2a020 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2a030 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2a040 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2a050 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2a060 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2a070 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2a080 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2a090 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2a0a0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2a0b0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2a0c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2a0d0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2a0e0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2a0f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2a100 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2a110 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2a120 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2a130 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2a140 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2a150 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2a160 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2a170 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2a180 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2a190 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2a1a0 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2a1b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a1c0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2a1d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2a1e0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a1f0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2a220 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2a230 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2a240 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2a260 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2a270 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2a280 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2a290 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2a2a0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2a2b0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a2c0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a2d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a2e0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2a2f0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2a300 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2a310 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2a320 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a330 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a340 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2a370 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a380 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
2a390 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
2a3a0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2a3b0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2a3c0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2a3d0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2a3e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2a3f0 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2a400 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2a410 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2a420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a430 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2a440 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2a450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2a460 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2a470 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2a480 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2a490 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2a4a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2a4b0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2a4c0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2a4d0 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2a4e0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2a4f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2a500 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2a510 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a530 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2a540 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2a550 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
2a560 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
2a570 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2a580 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
2a590 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2a5a0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2a5b0 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
2a5c0 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
2a5d0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
2a5e0 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
2a5f0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
2a600 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
2a610 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
2a620 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a630 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2a640 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2a650 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
2a660 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2a670 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
2a680 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2a690 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2a6a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a6b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a6c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2a6d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a6e0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a6f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  =0 && pCur->info
2a700 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2a710 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2a720 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2a730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2a740 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
2a750 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
2a760 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
2a770 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
2a780 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
2a790 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2a7a0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2a7b0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
2a7c0 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
2a7d0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2a7e0 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
2a7f0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2a800 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
2a810 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
2a820 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2a830 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
2a840 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
2a850 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
2a860 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a870 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2a880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a890 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2a8a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2a8b0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2a8c0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
2a8d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2a8e0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2a8f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a900 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
2a910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a920 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a930 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
2a940 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a950 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
2a960 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2a970 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2a980 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
2a990 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
2a9a0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a9b0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a9c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a9d0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2a9e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a9f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
2aa00 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2aa10 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43  e[0]->intKey==pC
2aa20 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
2aa30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2aa40 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49  >curIntKey || pI
2aa50 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
2aa60 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
2aa70 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
2aa80 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
2aa90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2aaa0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2aab0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2aac0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2aaf0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2ab00 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2ab10 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2ab20 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2ab30 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2ab40 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2ab50 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2ab60 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2ab70 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2ab80 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2ab90 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2aba0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2abb0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2abc0 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2abd0 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2abe0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2abf0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2ac00 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2ac10 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2ac20 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2ac30 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2ac40 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2ac50 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2ac60 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2ac70 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2ac80 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2ac90 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2aca0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2acb0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2acc0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2acd0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2ace0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2acf0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2ad00 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2ad10 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2ad20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2ad30 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2ad40 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2ad50 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2ad60 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2ad70 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2ad80 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2ad90 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2ada0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2adb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2adc0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2add0 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2ade0 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2adf0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2ae00 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2ae10 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2ae20 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2ae30 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2ae40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ae50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2ae60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2ae70 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2ae80 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2ae90 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2aea0 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2aeb0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2aec0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2aed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2aef0 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2af00 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2af10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2af20 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2af30 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2af40 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2af50 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2af60 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2af70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2af80 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2af90 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2afa0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2afb0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2afc0 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2afd0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2afe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2aff0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2b000 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2b010 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2b020 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2b030 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2b040 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2b050 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2b060 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2b070 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b080 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b090 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2b0a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2b0b0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2b0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2b0d0 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2b0e0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2b0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b100 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2b110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2b120 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2b130 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b140 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2b150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b170 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2b180 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2b190 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2b1a0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
2b1b0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2b1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
2b1d0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
2b1e0 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
2b1f0 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
2b200 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
2b210 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2b220 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2b230 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
2b240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
2b250 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
2b260 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
2b270 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
2b280 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
2b290 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
2b2a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
2b2b0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
2b2c0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
2b2d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2b2e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
2b2f0 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
2b300 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
2b310 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
2b320 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
2b330 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
2b340 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
2b350 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
2b360 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2b370 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
2b380 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
2b390 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
2b3a0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
2b3b0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
2b3c0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
2b3d0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
2b3e0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
2b3f0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
2b400 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
2b410 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
2b420 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
2b430 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
2b440 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
2b450 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
2b460 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
2b470 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2b480 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
2b490 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
2b4a0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
2b4b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
2b4c0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
2b4d0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
2b4e0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2b4f0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
2b500 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
2b510 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2b520 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2b530 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
2b540 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2b550 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2b560 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2b570 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
2b580 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2b590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2b5a0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
2b5b0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
2b5c0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
2b5d0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
2b5e0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
2b5f0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
2b600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b610 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
2b620 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
2b630 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2b640 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
2b650 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
2b660 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
2b670 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2b680 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b690 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2b6a0 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
2b6b0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2b6c0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2b6d0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2b6e0 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
2b6f0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2b700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b710 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
2b720 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
2b730 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
2b740 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
2b750 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
2b760 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
2b770 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
2b780 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
2b790 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2b7a0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
2b7b0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
2b7c0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
2b7d0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
2b7e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
2b7f0 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
2b800 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
2b810 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
2b820 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2b830 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2b840 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2b850 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
2b860 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
2b870 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
2b880 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
2b890 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
2b8a0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2b8b0 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
2b8c0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
2b8d0 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
2b8e0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
2b8f0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2b900 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
2b910 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
2b920 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
2b930 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
2b940 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
2b950 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
2b960 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
2b970 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
2b980 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2b990 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
2b9a0 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
2b9b0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
2b9c0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2b9d0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
2b9e0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
2b9f0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
2ba00 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
2ba10 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
2ba20 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
2ba30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ba40 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
2ba50 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2ba60 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2ba70 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
2ba80 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2ba90 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
2baa0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2bab0 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
2bac0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bad0 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
2bae0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
2baf0 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
2bb00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2bb10 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20  ( nCell<2 ){.   
2bb20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2bb30 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2bb40 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2bb50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2bb60 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2bb70 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2bb80 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2bb90 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2bba0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2bbb0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2bbc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2bbd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2bbe0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2bbf0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2bc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bc10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bc20 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2bc30 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2bc40 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2bc50 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2bc60 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2bc70 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b  r*)pCellKey, 2);
2bc80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2bc90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2bca0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2bcb0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2bcc0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2bcd0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2bce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2bcf0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2bd00 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2bd10 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2bd20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2bd30 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2bd40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bd50 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2bd60 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2bd70 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2bd80 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2bd90 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2bda0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2bdb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2bdc0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2bdd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2bde0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2bdf0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2be00 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2be10 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2be20 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2be30 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2be40 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2be50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2be60 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2be70 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2be80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2be90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bea0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2beb0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2bec0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2bed0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2bee0 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2bef0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2bf00 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2bf10 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2bf20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf30 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2bf40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2bf50 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2bf60 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2bf70 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2bf80 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2bf90 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2bfa0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2bfb0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2bfc0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2bfd0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2bfe0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2bff0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2c000 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2c010 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2c020 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2c030 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2c040 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c050 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2c060 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2c070 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c080 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c090 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2c0a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c0b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2c0c0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2c0d0 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2c0e0 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2c0f0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2c100 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2c110 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2c120 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2c130 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2c140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c150 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2c160 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2c170 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2c180 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
2c190 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2c1a0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2c1b0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c1c0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2c1d0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2c1e0 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2c1f0 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2c200 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2c210 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c220 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2c230 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2c240 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2c250 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2c260 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2c270 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2c280 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2c290 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2c2a0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2c2b0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2c2c0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2c2d0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2c2e0 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2c2f0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2c300 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2c310 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2c320 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2c330 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2c340 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2c350 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2c360 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2c370 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2c380 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2c390 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2c3a0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2c3b0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2c3c0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2c3d0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2c3e0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2c3f0 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2c400 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2c410 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2c420 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2c430 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2c440 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2c450 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2c460 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2c470 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2c480 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
2c490 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2c4a0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2c4b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c4c0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2c4d0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2c4e0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2c4f0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2c500 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2c510 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2c520 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2c530 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2c540 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2c550 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2c560 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2c570 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2c580 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2c590 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2c5a0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2c5b0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2c5c0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2c5d0 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2c5e0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2c5f0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2c600 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2c610 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2c620 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2c630 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2c640 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2c650 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2c660 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2c670 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2c680 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2c690 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2c6a0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2c6b0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2c6c0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2c6d0 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2c6e0 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2c6f0 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2c700 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2c710 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2c720 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2c730 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2c740 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2c750 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2c760 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2c770 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2c780 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2c790 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2c7a0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2c7b0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2c7c0 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2c7d0 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2c7e0 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2c7f0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2c800 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2c810 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2c820 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2c830 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2c840 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2c850 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2c860 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2c870 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2c880 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2c890 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2c8a0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2c8b0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2c8c0 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2c8d0 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2c8e0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2c8f0 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2c900 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2c910 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2c920 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2c930 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2c940 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c950 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2c960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c970 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2c980 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2c990 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2c9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2c9b0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2c9c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2c9d0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2c9e0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2c9f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ca00 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2ca10 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2ca20 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2ca30 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2ca40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ca50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ca60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2ca70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2ca80 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2ca90 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2caa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cab0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2cac0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2cad0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2cae0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2caf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2cb00 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2cb10 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2cb20 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2cb30 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2cb40 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2cb50 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2cb60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2cb70 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2cb80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2cb90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2cba0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2cbb0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2cbc0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2cbd0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2cbe0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2cbf0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2cc00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2cc10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2cc20 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2cc30 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2cc40 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2cc50 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2cc60 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2cc70 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2cc80 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2cc90 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2cca0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2ccb0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2ccc0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2ccd0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2cce0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2ccf0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2cd00 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2cd10 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2cd20 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2cd30 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2cd40 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2cd50 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2cd60 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2cd70 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2cd80 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2cd90 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2cda0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2cdb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2cdc0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cdd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2cde0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2cdf0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2ce00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ce10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ce20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ce30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ce40 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2ce50 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2ce60 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2ce70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2ce80 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2ce90 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2cea0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2ceb0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2cec0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2ced0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cee0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2cef0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2cf00 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2cf10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2cf20 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2cf30 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2cf40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2cf50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2cf60 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2cf70 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2cf80 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2cf90 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2cfa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2cfb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cfc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2cfd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2cfe0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2cff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d000 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d010 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d020 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2d030 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2d040 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d050 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2d060 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2d070 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2d080 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2d090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2d0a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2d0b0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2d0c0 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2d0d0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2d0e0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2d0f0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d100 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
2d110 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2d120 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d130 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2d140 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2d150 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
2d160 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d170 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d180 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2d190 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2d1a0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2d1b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d1c0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2d1d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d1e0 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
2d1f0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2d200 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d210 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
2d220 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2d230 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2d240 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2d250 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2d260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2d270 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2d280 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2d290 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2d2a0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2d2b0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2d2c0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2d2d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2d2e0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2d2f0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2d300 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2d310 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2d320 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2d330 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2d340 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2d350 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2d360 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2d370 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2d380 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2d390 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2d3a0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2d3b0 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
2d3c0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2d3d0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2d3e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d3f0 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
2d400 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2d410 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2d420 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2d430 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
2d440 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2d450 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2d460 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
2d470 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
2d480 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2d490 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2d4a0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2d4b0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
2d4c0 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
2d4d0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2d4e0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2d4f0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2d500 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2d510 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2d520 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2d530 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2d540 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2d550 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2d560 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2d570 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2d580 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2d590 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2d5a0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2d5b0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2d5c0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2d5d0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2d5e0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2d5f0 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2d600 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2d610 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2d620 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2d630 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2d640 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2d650 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2d660 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2d670 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2d680 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2d690 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2d6a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d6b0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2d6c0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2d6d0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2d6e0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2d6f0 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2d700 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2d710 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2d720 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2d730 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2d740 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2d750 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2d760 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2d770 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2d780 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2d790 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2d7a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2d7b0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
2d7c0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d7d0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2d7e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d7f0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d800 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d810 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2d820 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2d830 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2d840 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d850 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d860 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2d870 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d880 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2d890 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2d8a0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2d8b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d8c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d8d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d8e0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2d8f0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2d900 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2d910 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d940 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2d950 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d960 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d970 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d980 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d990 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2d9a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d9b0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2d9c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2d9d0 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
2d9e0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2d9f0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2da00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2da10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2da20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2da30 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2da40 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2da50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2da60 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
2da70 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2da80 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
2da90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
2daa0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2dab0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2dac0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2dad0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2dae0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2daf0 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
2db00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2db10 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
2db20 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2db30 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2db40 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
2db50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2db60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
2db70 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2db80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2db90 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2dba0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2dbb0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2dbc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2dbd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2dbe0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2dbf0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
2dc00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2dc10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2dc20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2dc30 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2dc40 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
2dc50 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2dc60 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
2dc70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2dc80 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
2dc90 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2dca0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2dcb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2dcc0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2dcd0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2dce0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2dcf0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2dd00 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2dd10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2dd20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2dd30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dd40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2dd50 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2dd60 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2dd70 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
2dd80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2dd90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2dda0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2ddb0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2ddc0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2ddd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dde0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2ddf0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2de00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2de10 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2de20 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2de30 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2de40 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2de50 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2de60 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2de70 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2de80 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2de90 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2dea0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2deb0 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2dec0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ded0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2dee0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2def0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2df00 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2df10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2df20 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2df30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2df40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2df50 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2df60 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2df70 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2df80 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2df90 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2dfa0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2dfb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dfc0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2dfd0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2dfe0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2dff0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2e000 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2e010 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2e020 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2e030 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2e040 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2e050 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2e060 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2e070 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2e080 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2e090 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2e0a0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2e0b0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2e0c0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2e0d0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2e0e0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2e0f0 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2e100 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2e110 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2e120 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2e130 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2e140 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2e150 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2e160 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2e170 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2e180 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2e190 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2e1a0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2e1b0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2e1c0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2e1d0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2e1e0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2e1f0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2e200 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2e210 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2e220 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2e230 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2e240 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2e250 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2e260 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2e270 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2e280 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2e290 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2e2a0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2e2b0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2e2c0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2e2d0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2e2e0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2e2f0 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2e300 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2e310 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2e320 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2e330 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2e340 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2e350 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2e360 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2e370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e380 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2e390 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2e3a0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2e3b0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2e3c0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2e3d0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2e3e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2e3f0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2e400 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2e410 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2e420 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2e430 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2e440 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2e450 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2e460 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2e470 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2e480 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2e490 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2e4a0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2e4b0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2e4c0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2e4d0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2e4e0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2e4f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e500 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2e510 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2e520 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2e530 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2e540 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2e550 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2e560 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2e570 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2e580 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2e590 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2e5a0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2e5b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e5c0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2e5d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e5e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2e5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2e600 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2e610 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2e620 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2e630 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2e640 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2e650 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2e660 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2e670 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2e680 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2e690 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2e6a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2e6b0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2e6c0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2e6d0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2e6e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2e6f0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2e700 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2e710 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2e720 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2e730 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2e740 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2e750 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2e760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e770 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2e780 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2e790 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2e7a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2e7b0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2e7c0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2e7d0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2e7e0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2e7f0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2e800 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2e810 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2e820 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2e830 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2e840 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2e850 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2e860 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2e870 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2e880 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2e890 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2e8a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e8b0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2e8c0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2e8d0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2e8e0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2e8f0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2e900 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2e910 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2e920 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2e930 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2e940 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e950 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2e960 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2e970 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2e980 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2e990 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2e9a0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2e9b0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2e9c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e9d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2e9e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e9f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2ea00 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2ea10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ea20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ea30 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2ea40 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2ea50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2ea60 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2ea70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ea80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2ea90 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2eaa0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2eab0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2eac0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2ead0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2eae0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2eaf0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2eb00 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2eb10 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2eb20 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2eb30 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2eb40 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2eb50 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2eb60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2eb70 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2eb80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2eb90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eba0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2ebb0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2ebc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2ebd0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2ebe0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2ebf0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2ec00 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2ec10 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2ec20 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2ec30 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2ec40 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2ec50 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2ec60 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2ec70 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2ec80 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2ec90 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2eca0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2ecb0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2ecc0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2ecd0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2ece0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2ecf0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2ed00 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2ed10 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2ed20 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2ed30 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2ed40 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2ed50 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2ed60 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2ed70 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2ed80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2ed90 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2eda0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2edb0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2edc0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2edd0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2ede0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2edf0 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2ee00 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2ee10 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2ee20 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2ee30 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2ee40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ee50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2ee60 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2ee70 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2ee80 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2ee90 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2eea0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2eeb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2eec0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2eed0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2eee0 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2eef0 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2ef00 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2ef10 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2ef20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ef30 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2ef40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2ef50 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2ef60 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2ef70 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2ef80 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2ef90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2efa0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2efb0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2efc0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2efd0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2efe0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2eff0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2f000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f010 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2f020 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2f030 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f040 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f050 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2f060 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2f070 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2f080 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2f090 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f0a0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2f0b0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2f0c0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2f0d0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2f0e0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2f0f0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2f100 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2f110 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2f120 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2f130 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2f140 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2f150 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2f160 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2f170 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2f180 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2f190 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2f1a0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2f1b0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2f1c0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2f1d0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2f1e0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2f1f0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2f200 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2f210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2f220 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2f230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f240 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2f250 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f260 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2f270 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f280 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f2a0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2f2b0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2f2c0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2f2d0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2f2e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f2f0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2f300 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2f310 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f320 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2f330 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2f340 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2f350 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2f360 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2f370 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2f380 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2f390 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2f3a0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2f3b0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2f3c0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2f3d0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2f3e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f3f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f400 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f410 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2f420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f430 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2f440 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2f450 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2f460 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2f470 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2f480 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2f490 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2f4a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f4b0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2f4c0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2f4d0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2f4e0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2f4f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2f500 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2f510 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2f520 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2f530 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2f540 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2f550 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2f560 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2f570 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2f580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f590 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f5a0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2f5b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2f5d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f5e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2f5f0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2f600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f610 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2f630 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2f640 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2f650 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f660 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f670 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f680 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f690 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2f6a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2f6b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f6c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f6d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f6e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f700 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2f710 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2f720 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2f730 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f740 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f760 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2f770 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2f780 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2f790 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2f7a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2f7b0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2f7c0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2f7d0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2f7e0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2f7f0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2f800 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2f810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f820 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2f830 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2f840 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2f850 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2f860 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2f870 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2f880 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2f890 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f8a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f8b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2f8c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f8d0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f8f0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2f900 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2f910 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2f920 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f930 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2f940 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2f950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f970 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f980 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f990 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2f9a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f9b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f9c0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2f9d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f9e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f9f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fa00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2fa10 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2fa20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fa30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fa40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2fa60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fa70 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fa80 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2fa90 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2faa0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2fab0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2fac0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2fad0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2fae0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2faf0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2fb00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2fb10 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2fb20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2fb30 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2fb40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2fb50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fb60 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2fb70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2fb80 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2fb90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2fba0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2fbb0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2fbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2fbd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fbe0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2fbf0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fc00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2fc20 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fc30 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fc40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2fc50 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2fc60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2fc70 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2fc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc90 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2fca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2fcb0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2fcc0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2fcd0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2fce0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2fcf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2fd00 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2fd10 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2fd20 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2fd30 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2fd40 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2fd50 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2fd60 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2fd70 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2fd80 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2fd90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2fda0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2fdb0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2fdc0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2fdd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fde0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fdf0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2fe00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2fe10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2fe20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2fe30 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2fe40 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2fe50 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2fe60 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2fe70 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2fe80 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2fe90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2feb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fed0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2fef0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2ff00 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2ff10 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2ff20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2ff30 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2ff40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ff50 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2ff60 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2ff70 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2ff80 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2ff90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2ffa0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2ffb0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2ffc0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2ffd0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2ffe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2fff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30000 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30020 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
30030 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
30040 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30050 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
30060 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
30070 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
30080 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
30090 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
300a0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
300b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
300c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
300d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
300e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
300f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30100 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
30110 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
30120 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
30130 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
30140 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
30150 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
30160 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
30170 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
30180 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
30190 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
301a0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
301b0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
301c0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
301d0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
301e0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
301f0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
30200 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
30210 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
30220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30230 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
30240 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
30250 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
30260 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30270 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
30280 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
302a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
302b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
302c0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
302d0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
302e0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
302f0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
30300 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
30310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30320 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
30330 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
30340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
30350 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
30360 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
30370 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
30380 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
30390 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
303a0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
303b0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
303c0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
303d0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
303e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
303f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30410 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
30420 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
30430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
30460 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
30470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
30480 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
30490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
304a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
304b0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
304c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
304d0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
304e0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
304f0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
30500 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
30510 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
30520 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30530 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
30540 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
30550 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
30560 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
30570 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
30580 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
30590 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
305a0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
305b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
305c0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
305d0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
305e0 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
305f0 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
30600 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
30610 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
30620 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
30630 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
30640 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
30650 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
30660 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
30670 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
30680 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
30690 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
306a0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
306b0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
306c0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
306d0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
306e0 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
306f0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
30700 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
30710 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
30720 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
30730 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
30740 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
30750 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
30760 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
30770 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
30780 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
30790 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
307a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
307b0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
307c0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
307d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
307e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
307f0 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
30800 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
30810 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
30820 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
30830 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
30840 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
30850 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
30860 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
30870 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
30880 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
30890 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
308a0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
308b0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
308c0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
308d0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
308e0 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
308f0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
30900 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30910 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
30920 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
30930 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
30940 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
30950 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
30960 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
30970 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
30980 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
30990 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
309a0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
309b0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
309c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
309d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
309e0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
309f0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
30a00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30a10 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
30a20 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
30a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30a40 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
30a50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30a60 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
30a70 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
30a80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
30a90 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
30aa0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
30ab0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
30ac0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
30ad0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
30ae0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
30af0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
30b00 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
30b10 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
30b20 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
30b30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
30b40 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
30b50 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
30b60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30b70 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
30b80 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
30b90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
30ba0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
30bb0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
30bc0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
30bd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30be0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
30bf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30c00 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
30c10 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
30c20 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
30c30 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
30c40 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
30c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30c60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30c80 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
30c90 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
30ca0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
30cb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
30cc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30cd0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
30ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
30cf0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
30d00 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30d10 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
30d20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
30d30 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
30d40 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
30d50 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
30d60 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
30d70 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
30d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
30d90 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
30da0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
30db0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
30dc0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
30dd0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
30de0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
30df0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30e00 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
30e10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30e20 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
30e30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
30e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30e50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30e60 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
30e70 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
30e80 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
30e90 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
30ea0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
30eb0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
30ec0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
30ed0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30ee0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
30ef0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
30f00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30f10 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
30f20 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
30f30 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
30f40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
30f50 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
30f60 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
30f70 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
30f80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
30f90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
30fa0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
30fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
30fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30fd0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
30fe0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
30ff0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31000 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
31010 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
31020 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
31030 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31040 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
31050 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
31060 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
31070 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
31080 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
31090 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
310a0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
310b0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
310c0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
310d0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
310e0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
310f0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
31100 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
31110 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
31120 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
31130 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
31140 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
31150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
31160 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
31170 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
31180 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
31190 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
311a0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
311b0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
311c0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
311d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
311e0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
311f0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
31200 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
31210 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
31220 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
31250 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
31260 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31280 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31290 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
312a0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
312b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
312c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
312d0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
312e0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
312f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
31300 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
31310 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31320 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
31330 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
31340 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
31370 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
31380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
313a0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
313b0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
313c0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
313d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
313e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
313f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
31400 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
31410 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
31420 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
31430 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
31440 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
31450 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
31460 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31470 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
31480 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
31490 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
314a0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
314b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
314c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
314d0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
314e0 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
314f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
31500 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
31510 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
31520 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
31530 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31540 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31550 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
31560 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31570 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
31580 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31590 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
315a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
315b0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
315c0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
315d0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
315e0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
315f0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
31600 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
31610 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
31620 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
31630 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
31640 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
31650 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
31660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
31670 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
31680 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
31690 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
316a0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
316b0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
316c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
316d0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
316e0 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
316f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
31700 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31710 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
31720 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
31730 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
31740 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
31750 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
31760 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
31770 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
31780 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
31790 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
317a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
317b0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
317c0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
317d0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
317e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
317f0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
31800 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
31810 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31820 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31830 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
31840 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
31850 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
31860 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
31870 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
31880 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
31890 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
318a0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
318b0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
318c0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
318d0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
318e0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
318f0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
31900 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
31910 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
31920 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
31930 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
31940 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
31950 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
31960 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
31970 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
31980 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
31990 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
319a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
319b0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
319c0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
319d0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
319e0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
319f0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
31a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31a10 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
31a20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
31a30 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
31a40 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
31a50 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31a60 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
31a70 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
31a80 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
31a90 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
31aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31ab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31ac0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31ad0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
31ae0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31af0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
31b00 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
31b10 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
31b20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
31b30 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31b40 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
31b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31b60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
31b70 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31b80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
31b90 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
31ba0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
31bb0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
31bc0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31bd0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
31be0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
31bf0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
31c00 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
31c10 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
31c20 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
31c30 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
31c40 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
31c50 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
31c60 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
31c70 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
31c80 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
31c90 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
31ca0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
31cb0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
31cc0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
31cd0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
31ce0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
31cf0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
31d00 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
31d10 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
31d20 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
31d30 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
31d40 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
31d50 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
31d60 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
31d70 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
31d80 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
31d90 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
31da0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
31db0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
31dc0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
31dd0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31de0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
31df0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
31e00 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
31e10 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31e20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
31e30 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
31e40 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
31e50 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
31e60 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
31e70 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
31e80 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
31e90 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
31ea0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
31eb0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
31ec0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
31ed0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
31ee0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
31ef0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
31f00 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
31f10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
31f20 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
31f30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
31f40 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
31f50 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
31f60 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
31f70 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
31f80 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
31f90 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31fa0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
31fb0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
31fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
31fd0 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
31fe0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31ff0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
32000 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
32010 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32020 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
32030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32040 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32050 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32080 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
32090 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
320a0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
320b0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
320c0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
320d0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
320e0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
320f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
32100 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
32110 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
32120 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
32130 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
32140 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
32160 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
32170 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
32180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32190 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
321a0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
321b0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
321c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
321d0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
321e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
321f0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
32200 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
32210 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
32220 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
32230 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
32240 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
32250 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
32260 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
32270 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
32280 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32290 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
322a0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
322b0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
322c0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
322d0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
322e0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
322f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
32300 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
32310 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
32320 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
32330 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
32340 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
32350 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
32360 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
32370 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
32380 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
32390 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
323a0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
323b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
323c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
323d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
323e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
323f0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
32400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32410 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
32420 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
32430 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
32440 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
32450 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
32460 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
32470 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32480 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
32490 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
324a0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
324b0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
324c0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
324d0 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
324e0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
324f0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
32500 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
32510 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
32520 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32530 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
32540 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
32550 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
32560 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
32570 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
32580 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
32590 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
325a0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
325b0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
325c0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
325d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
325e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
325f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
32600 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32610 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
32620 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
32630 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
32640 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
32650 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
32660 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
32670 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
32680 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
32690 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
326a0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
326b0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
326c0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
326d0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
326e0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
326f0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
32700 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
32710 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
32720 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
32730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
32740 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
32750 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
32760 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
32770 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
32780 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
32790 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
327a0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
327b0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
327c0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
327d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
327e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
327f0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
32800 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
32810 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
32820 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
32830 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
32840 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
32850 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
32860 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32870 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
32880 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
32890 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
328a0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
328b0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
328c0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
328d0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
328e0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
328f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32900 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
32910 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
32920 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
32930 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
32940 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
32950 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
32960 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
32970 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
32980 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
32990 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
329a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
329b0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
329c0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
329d0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
329e0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
329f0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
32a00 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
32a10 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
32a20 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
32a30 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
32a40 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
32a50 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
32a60 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
32a70 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
32a80 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
32a90 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
32aa0 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
32ab0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
32ac0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
32ad0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
32ae0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
32af0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
32b00 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
32b10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
32b20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
32b30 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
32b40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
32b50 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
32b60 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
32b70 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
32b80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
32b90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
32bb0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
32bc0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
32bd0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
32be0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
32bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32c00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32c10 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
32c20 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
32c30 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
32c40 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
32c50 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
32c60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
32c70 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
32c80 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
32c90 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
32ca0 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
32cb0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
32cc0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
32cd0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
32ce0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
32cf0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
32d00 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
32d10 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
32d20 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
32d30 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
32d40 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
32d50 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
32d60 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
32d70 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
32d80 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
32d90 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
32da0 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
32db0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
32dc0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
32dd0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
32de0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
32df0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
32e00 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
32e10 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
32e20 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
32e30 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
32e40 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
32e50 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
32e60 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
32e70 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
32e80 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
32e90 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
32ea0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
32eb0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
32ec0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
32ed0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
32ee0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
32ef0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
32f00 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
32f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32f20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
32f40 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
32f50 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
32f60 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
32f70 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
32f80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
32f90 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
32fa0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
32fb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32fc0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
32fd0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
32fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
33000 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
33010 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
33020 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
33030 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
33040 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
33050 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
33060 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
33070 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
33080 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
33090 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
330a0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
330b0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
330c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
330d0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
330e0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
330f0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
33100 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
33110 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
33120 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
33130 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
33140 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
33150 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
33160 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
33170 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
33180 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
33190 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
331a0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
331b0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
331c0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
331d0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
331e0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
331f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
33200 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
33210 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
33220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33230 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
33240 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
33250 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
33260 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
33270 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
33280 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
33290 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
332a0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
332b0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
332c0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
332d0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
332e0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
332f0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
33300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33310 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
33320 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
33330 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
33340 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
33350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33360 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
33370 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
33380 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
33390 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
333a0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
333b0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
333c0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
333d0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
333e0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
333f0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
33400 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
33410 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33420 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
33430 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
33440 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
33450 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
33460 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
33470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33480 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33490 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
334a0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
334b0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
334c0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
334d0 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
334e0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
334f0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
33500 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
33510 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
33520 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
33530 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
33540 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
33550 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
33560 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
33570 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33580 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33590 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
335a0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
335b0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
335c0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
335d0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
335e0 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
335f0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
33600 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
33610 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
33620 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33630 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
33640 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
33650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33660 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
33670 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33680 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
33690 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
336a0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
336b0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
336c0 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
336d0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
336e0 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
336f0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
33700 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
33710 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
33720 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
33730 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
33740 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
33750 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
33760 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
33770 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
33780 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
33790 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
337a0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
337b0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
337c0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
337d0 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
337e0 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
337f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
33800 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
33810 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
33820 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
33830 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
33840 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
33850 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
33860 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
33870 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
33880 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
33890 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
338a0 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
338b0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
338c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
338d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
338e0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
338f0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
33900 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
33910 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
33920 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
33930 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
33940 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
33950 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
33960 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
33970 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
33980 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
33990 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
339a0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
339b0 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
339c0 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
339d0 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
339e0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
339f0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
33a00 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
33a10 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
33a20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
33a30 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
33a40 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
33a50 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
33a60 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
33a70 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
33a80 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
33a90 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
33aa0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
33ab0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
33ac0 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
33ad0 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
33ae0 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
33af0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
33b00 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
33b10 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
33b20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
33b30 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
33b40 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
33b50 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
33b60 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
33b70 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
33b80 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
33b90 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
33ba0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
33bb0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
33bc0 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
33bd0 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
33be0 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
33bf0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
33c00 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
33c10 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
33c20 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
33c30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
33c40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
33c50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
33c60 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
33c70 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
33c80 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
33c90 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
33ca0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
33cb0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
33cc0 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
33cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
33ce0 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
33cf0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
33d00 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
33d10 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
33d20 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
33d30 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
33d40 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
33d50 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
33d60 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
33d70 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
33d80 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
33d90 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
33da0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
33db0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
33dc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33dd0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
33de0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
33df0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
33e00 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
33e10 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
33e20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
33e30 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33e40 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
33e50 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
33e60 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
33e70 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
33e80 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
33e90 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
33ea0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
33eb0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
33ec0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
33ed0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
33ee0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
33ef0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
33f00 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
33f10 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
33f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33f30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
33f40 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
33f50 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
33f60 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
33f70 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
33f80 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
33f90 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
33fa0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
33fb0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
33fc0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
33fd0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
33fe0 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
33ff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
34000 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
34010 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
34020 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
34030 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
34040 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
34050 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
34060 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
34070 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
34080 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
34090 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
340a0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
340b0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
340c0 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
340d0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
340e0 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
340f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
34100 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
34110 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
34120 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
34130 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
34140 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34150 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
34160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34170 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
34180 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
34190 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
341a0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
341b0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
341c0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
341d0 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
341e0 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
341f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34200 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
34210 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
34220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34230 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
34240 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
34250 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
34260 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
34270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34280 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
34290 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
342a0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
342b0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
342c0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
342d0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
342e0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
342f0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
34300 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
34310 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
34320 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34330 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34340 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34350 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
34360 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
34370 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
34380 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
34390 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
343a0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
343b0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
343c0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
343d0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
343e0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
343f0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
34400 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34410 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34420 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34430 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34440 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34450 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34460 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
34470 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
34480 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
34490 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
344a0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
344b0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
344c0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
344d0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
344e0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
344f0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
34500 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
34510 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
34520 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
34530 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
34540 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
34550 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
34560 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
34570 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
34580 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
34590 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
345a0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
345b0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
345c0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
345d0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
345e0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
345f0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
34600 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
34610 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
34620 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34630 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34640 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
34650 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
34660 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
34670 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
34680 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
34690 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
346a0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
346b0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
346c0 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
346d0 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
346e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
346f0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34700 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34710 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34720 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34730 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
34740 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
34750 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
34760 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
34770 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
34780 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
34790 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
347a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
347b0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
347c0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
347d0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
347e0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
347f0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
34800 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
34810 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
34820 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
34830 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
34840 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
34850 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
34860 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
34870 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
34880 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
34890 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
348a0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
348b0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
348c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
348d0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
348e0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
348f0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
34900 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
34910 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
34920 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
34930 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
34940 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
34950 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
34960 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
34970 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
34980 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
34990 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
349a0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
349b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
349c0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
349d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
349e0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
349f0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
34a00 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
34a10 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
34a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
34a30 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
34a40 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
34a50 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
34a60 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
34a70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
34a80 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
34a90 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
34aa0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
34ab0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
34ac0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
34ad0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
34ae0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
34af0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
34b00 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
34b10 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
34b20 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
34b30 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
34b40 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
34b50 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
34b60 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
34b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
34b80 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
34b90 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
34ba0 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
34bb0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34bc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34bd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
34be0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34bf0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
34c00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
34c10 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
34c20 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
34c30 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
34c40 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
34c50 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
34c60 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
34c70 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
34c80 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
34c90 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
34ca0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
34cb0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
34cc0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
34cd0 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
34ce0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
34cf0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
34d00 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
34d10 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
34d20 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
34d30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
34d40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
34d50 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
34d60 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
34d70 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
34d80 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
34d90 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
34da0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
34db0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
34dc0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
34dd0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
34de0 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
34df0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
34e00 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34e10 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
34e20 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
34e30 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
34e40 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
34e50 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
34e60 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
34e80 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
34e90 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
34ea0 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
34eb0 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
34ec0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
34ed0 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
34ee0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
34ef0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
34f00 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
34f10 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
34f20 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
34f30 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
34f40 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
34f50 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
34f60 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
34f70 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
34f80 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
34f90 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
34fa0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
34fb0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
34fc0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
34fd0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
34fe0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
34ff0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
35000 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
35010 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
35020 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
35030 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
35040 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
35050 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
35060 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
35070 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
35080 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
35090 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
350a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
350b0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
350c0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
350d0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
350e0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
350f0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
35100 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
35110 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
35120 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
35130 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
35140 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
35150 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
35160 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
35170 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
35180 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
35190 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
351a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
351b0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
351c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
351d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
351e0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
351f0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
35200 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
35210 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
35220 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
35230 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
35240 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
35250 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
35260 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
35270 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
35280 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
35290 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
352a0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
352b0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
352c0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
352d0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
352e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
352f0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
35300 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
35310 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
35320 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
35330 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
35340 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
35350 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
35360 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  nter */.  u8 *da
35370 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
35380 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
35390 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
353a0 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20    u8 *pIns;     
353b0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
353c0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
353d0 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63  Idx[] where no c
353e0 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ell inserted */.
353f0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35400 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35410 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
35420 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
35430 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
35440 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
35450 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
35460 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
35470 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
35480 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
35490 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
354a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
354b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
354c0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
354d0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
354e0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
354f0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
35500 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35510 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
35520 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35530 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35540 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
35550 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
35560 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
35570 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
35580 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
35590 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
355a0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
355b0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
355c0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
355d0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
355e0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
355f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
35600 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
35610 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
35620 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
35630 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
35640 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
35650 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
35660 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
35670 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
35680 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
35690 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
356a0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
356b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
356c0 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
356d0 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
356e0 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
356f0 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
35700 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35710 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
35720 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
35730 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
35740 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
35750 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
35760 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
35770 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
35780 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
35790 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
357a0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
357b0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
357c0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
357d0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
357e0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
357f0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
35800 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
35810 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
35820 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
35830 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
35840 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
35850 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
35860 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
35870 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
35880 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
35890 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
358a0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
358b0 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
358c0 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
358d0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
358e0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
358f0 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
35900 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
35910 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
35920 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
35930 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
35940 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
35950 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
35960 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
35970 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
35980 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
35990 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
359a0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
359b0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
359c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
359d0 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
359e0 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
359f0 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
35a00 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
35a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
35a20 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
35a30 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
35a40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
35a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35a60 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
35a70 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
35a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
35a90 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
35aa0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35ab0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
35ac0 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
35ad0 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
35ae0 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
35af0 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
35b00 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
35b10 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
35b20 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
35b30 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
35b40 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
35b50 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
35b60 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
35b70 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
35b80 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
35b90 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
35ba0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
35bb0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
35bc0 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
35bd0 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
35be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35bf0 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
35c00 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
35c10 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
35c20 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
35c30 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
35c40 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
35c50 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
35c60 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
35c70 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
35c80 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
35c90 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
35ca0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
35cb0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
35cc0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
35cd0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
35ce0 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d     pIns = pPage-
35cf0 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b  >aCellIdx + i*2;
35d00 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e  .    memmove(pIn
35d10 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50  s+2, pIns, 2*(pP
35d20 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29  age->nCell - i))
35d30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
35d40 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  Ins, idx);.    p
35d50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
35d60 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20     /* increment 
35d70 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a  the cell count *
35d80 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74  /.    if( (++dat
35d90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
35da0 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61  et+4])==0 ) data
35db0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
35dc0 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65  t+3]++;.    asse
35dd0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
35de0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
35df0 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+3])==pPage->
35e00 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66  nCell );.#ifndef
35e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
35e20 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
35e30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
35e40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
35e50 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
35e60 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
35e70 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
35e80 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
35e90 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
35ea0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
35eb0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
35ec0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
35ed0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
35ee0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
35ef0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
35f00 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
35f10 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
35f20 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a   A CellArray obj
35f30 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ect contains a c
35f40 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73  ache of pointers
35f50 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61   and sizes for a
35f60 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20  .** consecutive 
35f70 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c  sequence of cell
35f80 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
35f90 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61  held multiple pa
35fa0 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ges..*/.typedef 
35fb0 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
35fc0 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75   CellArray;.stru
35fd0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20  ct CellArray {. 
35fe0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
35ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36000 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
36010 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  pCell[] */.  Mem
36020 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20  Page *pRef;     
36030 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
36040 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
36050 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
36060 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
36070 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
36080 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
36090 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
360a0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
360b0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
360c0 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  l[] */.};../*.**
360d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
360e0 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78  ell sizes at idx
360f0 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64  , idx+1, ..., id
36100 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a  x+N-1 have been.
36110 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a  ** computed..*/.
36120 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75  static void popu
36130 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65  lateCellCache(Ce
36140 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36150 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61  idx, int N){.  a
36160 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
36170 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c   idx+N<=p->nCell
36180 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30   );.  while( N>0
36190 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
361a0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d  p->apCell[idx]!=
361b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
361c0 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29  szCell[idx]==0 )
361d0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c  {.      p->szCel
361e0 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66  l[idx] = p->pRef
361f0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
36200 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
36210 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dx]);.    }else{
36220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43  .      assert( C
36230 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20  ORRUPT_DB ||.   
36240 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a             p->sz
36250 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52  Cell[idx]==p->pR
36260 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
36270 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
36280 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a  [idx]) );.    }.
36290 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e      idx++;.    N
362a0 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
362b0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
362c0 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d   of the Nth elem
362d0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ent of the cell 
362e0 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20  array.*/.static 
362f0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
36300 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53  u16 computeCellS
36310 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
36320 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
36330 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
36340 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
36350 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  rt( p->szCell[N]
36360 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65  ==0 );.  p->szCe
36370 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  ll[N] = p->pRef-
36380 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
36390 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d  ef, p->apCell[N]
363a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73  );.  return p->s
363b0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74  zCell[N];.}.stat
363c0 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c  ic u16 cachedCel
363d0 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20  lSize(CellArray 
363e0 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
363f0 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c  sert( N>=0 && N<
36400 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  p->nCell );.  if
36410 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29  ( p->szCell[N] )
36420 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36430 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63  l[N];.  return c
36440 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70  omputeCellSize(p
36450 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , N);.}../*.** A
36460 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
36470 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
36480 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
36490 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
364a0 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
364b0 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
364c0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
364d0 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
364e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
364f0 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
36500 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
36510 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
36520 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
36530 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
36540 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
36550 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
36560 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
36570 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
36580 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
36590 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
365a0 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
365b0 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
365c0 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
365d0 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
365e0 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
365f0 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
36600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
36610 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
36620 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
36630 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
36640 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
36650 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
36660 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
36670 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
36680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
36690 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65  ebuildPage(.  Me
366a0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
366b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
366c0 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20   Edit this page 
366d0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
36700 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
36710 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36720 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
36730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36740 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
36750 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
36760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36770 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
36780 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
36790 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
367a0 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
367b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
367c0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
367d0 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63   pPg */.  u8 * c
367e0 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
367f0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
36800 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
36810 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f   data for pPg */
36820 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61  .  const int usa
36830 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
36840 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
36850 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
36860 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c  d = &aData[usabl
36870 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b  eSize];.  int i;
36880 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20  .  u8 *pCellptr 
36890 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
368a0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
368b0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
368c0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
368d0 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61  ager);.  u8 *pDa
368e0 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62  ta;..  i = get2b
368f0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
36900 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54  ]);.  memcpy(&pT
36910 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d  mp[i], &aData[i]
36920 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69  , usableSize - i
36930 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45  );..  pData = pE
36940 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nd;.  for(i=0; i
36950 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
36960 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
36970 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
36980 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20   pCell>aData && 
36990 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20  pCell<pEnd ){.  
369a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
369b0 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
369c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74  ;.    }.    pDat
369d0 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  a -= szCell[i];.
369e0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
369f0 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
36a00 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
36a10 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
36a20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c  if( pData < pCel
36a30 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51  lptr ) return SQ
36a40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36a50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  T;.    memcpy(pD
36a60 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65  ata, pCell, szCe
36a70 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[i]);.    asse
36a80 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70  rt( szCell[i]==p
36a90 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  Pg->xCellSize(pP
36aa0 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52  g, pCell) || COR
36ab0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74  RUPT_DB );.    t
36ac0 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b  estcase( szCell[
36ad0 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69  i]!=pPg->xCellSi
36ae0 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b  ze(pPg,pCell) );
36af0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
36b00 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
36b10 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
36b20 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
36b30 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
36b40 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
36b50 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
36b60 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
36b70 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
36b80 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
36b90 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
36ba0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
36bb0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
36bc0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
36bd0 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
36be0 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
36bf0 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  0x00;.  return S
36c00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
36c10 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36c20 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
36c30 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
36c40 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
36c50 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61   szCell.** conta
36c60 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
36c70 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
36c80 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
36c90 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
36ca0 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63  to .** add the c
36cb0 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ells stored in t
36cc0 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65  he array to page
36cd0 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e   pPg. If it cann
36ce0 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20  ot (because .** 
36cf0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
36d00 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65  o be defragmente
36d10 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c  d before the cel
36d20 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f  ls will fit), no
36d30 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74  n-zero.** is ret
36d40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
36d50 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61  , if the cells a
36d60 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73  re added success
36d70 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a  fully, zero is.*
36d80 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
36d90 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c  * Argument pCell
36da0 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ptr points to th
36db0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
36dc0 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
36dd0 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74  r array.** (part
36de0 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f   of page pPg) to
36df0 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72   populate. After
36e00 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20   cell apCell[0] 
36e10 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
36e20 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20  e.** page body, 
36e30 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20  a 16-bit offset 
36e40 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43  is written to pC
36e50 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f  ellptr. And so o
36e60 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  n, for each.** c
36e70 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
36e80 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
36e90 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
36ea0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
36eb0 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  re.** that it is
36ec0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69   safe to overwri
36ed0 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  te this part of 
36ee0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
36ef0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68   array..**.** Wh
36f00 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
36f10 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44   is called, *ppD
36f20 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ata points to th
36f30 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a  e start of the .
36f40 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ** content area 
36f50 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  on page pPg. If 
36f60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36f70 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
36f80 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70  extended,.** *pp
36f90 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20  Data is updated 
36fa0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
36fb0 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65  new start of the
36fc0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a   content area.**
36fd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
36fe0 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79  g..**.** Finally
36ff0 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69  , argument pBegi
37000 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
37010 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
37020 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a   following the.*
37030 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61  * end of the spa
37040 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ce required by t
37050 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65  his page for the
37060 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37070 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63  ea (for.** all c
37080 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20  ells - not just 
37090 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62  those inserted b
370a0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  y the current ca
370b0 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74  ll). If the cont
370c0 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74  ent.** area must
370d0 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
370e0 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e  before this poin
370f0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63  t in order to ac
37100 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20  comodate all.** 
37110 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
37120 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ], then the cell
37130 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64  s do not fit and
37140 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
37150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
37160 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41   int pageInsertA
37170 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
37180 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
37190 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
371a0 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20  to add cells to 
371b0 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c  */.  u8 *pBegin,
371c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371d0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63       /* End of c
371e0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
371f0 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61  y */.  u8 **ppDa
37200 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
37210 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
37220 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d  : Page content -
37230 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  area pointer */.
37240 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20    u8 *pCellptr, 
37250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37260 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
37270 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
37280 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  a */.  int iFirs
37290 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
372a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
372b0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
372c0 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43   add */.  int nC
372d0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
372e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
372f0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
37300 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20  add to pPg */.  
37310 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
37320 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
37330 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
37340 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
37350 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70  .  u8 *aData = p
37360 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
37370 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61  *pData = *ppData
37380 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  ;.  int iEnd = i
37390 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20  First + nCell;. 
373a0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
373b0 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f  _DB || pPg->hdrO
373c0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f  ffset==0 );    /
373d0 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  * Never called o
373e0 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f  n page 1 */.  fo
373f0 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
37400 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  nd; i++){.    in
37410 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38  t sz, rc;.    u8
37420 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20   *pSlot;.    sz 
37430 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  = cachedCellSize
37440 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20  (pCArray, i);.  
37450 20 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d    if( (aData[1]=
37460 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d  =0 && aData[2]==
37470 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70  0) || (pSlot = p
37480 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c  ageFindSlot(pPg,
37490 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20  sz,&rc))==0 ){. 
374a0 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a       pData -= sz
374b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
374c0 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75 72  a<pBegin ) retur
374d0 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74  n 1;.      pSlot
374e0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
374f0 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64      /* pSlot and
37500 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37510 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  [i] will never o
37520 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c  verlap on a well
37530 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64  -formed.    ** d
37540 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74 68  atabase.  But th
37550 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63  ey might for a c
37560 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
37570 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d    Hence use memm
37580 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e  ove().    ** sin
37590 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64  ce memcpy() send
375a0 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68 20  s SIGABORT with 
375b0 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66  overlapping buff
375c0 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a  ers on OpenBSD *
375d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
375e0 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61  Slot+sz)<=pCArra
375f0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20  y->apCell[i].   
37600 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d        || pSlot>=
37610 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c  (pCArray->apCell
37620 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20  [i]+sz).        
37630 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
37640 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53  ;.    memmove(pS
37650 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70  lot, pCArray->ap
37660 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
37670 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
37680 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44  ptr, (pSlot - aD
37690 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
376a0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
376b0 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  *ppData = pData;
376c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
376d0 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
376e0 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43  ll[] contains nC
376f0 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ell pointers to 
37700 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72  b-tree cells. Ar
37710 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63  ray szCell .** c
37720 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
37730 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
37740 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
37750 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20  s function adds 
37760 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73  the.** space ass
37770 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
37780 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72  h cell in the ar
37790 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72  ray that is curr
377a0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a  ently stored .**
377b0 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
377c0 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70   of pPg to the p
377d0 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  Pg free-list. Th
377e0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20  e cell-pointers 
377f0 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65  and other.** fie
37800 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  lds of the page 
37810 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e  are not updated.
37820 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
37830 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
37840 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
37850 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20   cells added to 
37860 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
37870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
37880 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65  eFreeArray(.  Me
37890 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
378a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
378b0 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f   Page to edit */
378c0 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20  .  int iFirst,  
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c     /* First cell
378f0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
37900 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37920 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65  /* Cells to dele
37930 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  te */.  CellArra
37940 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
37950 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
37960 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a   of cells */.){.
37970 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
37980 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37990 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45  .  u8 * const pE
379a0 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  nd = &aData[pPg-
379b0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
379c0 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  ];.  u8 * const 
379d0 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b  pStart = &aData[
379e0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  pPg->hdrOffset +
379f0 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50   8 + pPg->childP
37a00 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e  trSize];.  int n
37a10 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Ret = 0;.  int i
37a20 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  ;.  int iEnd = i
37a30 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20  First + nCell;. 
37a40 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
37a50 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30    int szFree = 0
37a60 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  ;..  for(i=iFirs
37a70 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b  t; i<iEnd; i++){
37a80 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
37a90 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37aa0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65  [i];.    if( pCe
37ab0 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43  ll>=pStart && pC
37ac0 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
37ad0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
37ae0 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73  /* No need to us
37af0 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  e cachedCellSize
37b00 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69  () here.  The si
37b10 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
37b20 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
37b30 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  re to be freed h
37b40 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
37b50 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65   computing while
37b60 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a   deciding which.
37b70 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e        ** cells n
37b80 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  eed freeing */. 
37b90 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61       sz = pCArra
37ba0 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61  y->szCell[i];  a
37bb0 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20  ssert( sz>0 );. 
37bc0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d       if( pFree!=
37bd0 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a  (pCell + sz) ){.
37be0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
37bf0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
37c00 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61  ssert( pFree>aDa
37c10 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61  ta && (pFree - a
37c20 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  Data)<65536 );. 
37c30 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70 61           freeSpa
37c40 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
37c50 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
37c60 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Free);.        }
37c70 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
37c80 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
37c90 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20  szFree = sz;.   
37ca0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 2b 73       if( pFree+s
37cb0 7a 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  z>pEnd ) return 
37cc0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
37cd0 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
37ce0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  pCell;.        s
37cf0 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  zFree += sz;.   
37d00 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b     }.      nRet+
37d10 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
37d20 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
37d30 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44  assert( pFree>aD
37d40 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20  ata && (pFree - 
37d50 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a  aData)<65536 );.
37d60 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
37d70 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
37d80 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
37d90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
37da0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70  Ret;.}../*.** ap
37db0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
37dc0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
37dd0 6e 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69 7a  nters to and siz
37de0 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  es of all cells 
37df0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73 20  in the.** pages 
37e00 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20  being balanced. 
37e10 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   The current pag
37e20 65 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67 2d  e, pPg, has pPg-
37e30 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61  >nCell cells sta
37e40 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70  rting.** with ap
37e50 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66 74  Cell[iOld].  Aft
37e60 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  er balancing, th
37e70 69 73 20 70 61 67 65 20 73 68 6f 75 6c 64 20 68  is page should h
37e80 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a  old nNew cells.*
37e90 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 70  * starting at ap
37ea0 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a  Cell[iNew]..**.*
37eb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
37ec0 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
37ed0 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74  ry adjustments t
37ee0 6f 20 70 50 67 20 73 6f 20 74 68 61 74 20 69 74  o pPg so that it
37ef0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
37f00 20 63 6f 72 72 65 63 74 20 63 65 6c 6c 73 20 61   correct cells a
37f10 66 74 65 72 20 62 65 69 6e 67 20 62 61 6c 61 6e  fter being balan
37f20 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ced..**.** The p
37f30 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
37f40 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20  is invalid when 
37f50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
37f60 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68 65  turns. It is the
37f70 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
37f80 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
37f90 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65   to set it corre
37fa0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
37fb0 69 6e 74 20 65 64 69 74 50 61 67 65 28 0a 20 20  int editPage(.  
37fc0 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
37fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fe0 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67  /* Edit this pag
37ff0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 2c  e */.  int iOld,
38000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38010 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
38020 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 63 75  of first cell cu
38030 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67 65 20  rrently on page 
38040 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c 20 20  */.  int iNew,  
38050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38060 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
38070 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c 6c 20   new first cell 
38080 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
38090 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   nNew,          
380a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
380b0 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
380c0 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
380d0 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43  .  CellArray *pC
380e0 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
380f0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
38100 65 6c 6c 73 20 61 6e 64 20 73 69 7a 65 73 20 2a  ells and sizes *
38110 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  /.){.  u8 * cons
38120 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
38130 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  Data;.  const in
38140 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
38150 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 70 42  Offset;.  u8 *pB
38160 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65  egin = &pPg->aCe
38170 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b  llIdx[nNew * 2];
38180 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70  .  int nCell = p
38190 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20  Pg->nCell;      
381a0 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f 72 65 64   /* Cells stored
381b0 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
381c0 2a 70 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 43  *pData;.  u8 *pC
381d0 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b  ellptr;.  int i;
381e0 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d  .  int iOldEnd =
381f0 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65   iOld + pPg->nCe
38200 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66  ll + pPg->nOverf
38210 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45  low;.  int iNewE
38220 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77  nd = iNew + nNew
38230 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
38240 5f 44 45 42 55 47 0a 20 20 75 38 20 2a 70 54 6d  _DEBUG.  u8 *pTm
38250 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
38260 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
38270 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d  Bt->pPager);.  m
38280 65 6d 63 70 79 28 70 54 6d 70 2c 20 61 44 61 74  emcpy(pTmp, aDat
38290 61 2c 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  a, pPg->pBt->usa
382a0 62 6c 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  bleSize);.#endif
382b0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65  ..  /* Remove ce
382c0 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  lls from the sta
382d0 72 74 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68  rt and end of th
382e0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  e page */.  if( 
382f0 69 4f 6c 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20  iOld<iNew ){.   
38300 20 69 6e 74 20 6e 53 68 69 66 74 20 3d 20 70 61   int nShift = pa
38310 67 65 46 72 65 65 41 72 72 61 79 28 70 50 67 2c  geFreeArray(pPg,
38320 20 69 4f 6c 64 2c 20 69 4e 65 77 2d 69 4f 6c 64   iOld, iNew-iOld
38330 2c 20 70 43 41 72 72 61 79 29 3b 0a 20 20 20 20  , pCArray);.    
38340 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43 65  memmove(pPg->aCe
38350 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43 65  llIdx, &pPg->aCe
38360 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d 2c  llIdx[nShift*2],
38370 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e   nCell*2);.    n
38380 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b 0a  Cell -= nShift;.
38390 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45 6e    }.  if( iNewEn
383a0 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a 20  d < iOldEnd ){. 
383b0 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67 65     nCell -= page
383c0 46 72 65 65 41 72 72 61 79 28 70 50 67 2c 20 69  FreeArray(pPg, i
383d0 4e 65 77 45 6e 64 2c 20 69 4f 6c 64 45 6e 64 20  NewEnd, iOldEnd 
383e0 2d 20 69 4e 65 77 45 6e 64 2c 20 70 43 41 72 72  - iNewEnd, pCArr
383f0 61 79 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74  ay);.  }..  pDat
38400 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62  a = &aData[get2b
38410 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61 74  yteNotZero(&aDat
38420 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66  a[hdr+5])];.  if
38430 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29  ( pData<pBegin )
38440 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
38450 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41