/ Hex Artifact Content
Login

Artifact 9114263de91fa983a7ae6bbd75bb044552e4a7fb:


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 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7e50: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
7e60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
7e70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
7e80: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
7e90: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
7eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7ec0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7ed0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7ee0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7ef0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7f00: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7f10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f20: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7f30: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7f40: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7f50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f60: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7f70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7f80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7f90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7fa0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
7fd0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
7fe0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8000: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8010: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8020: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8030: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8040: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8050: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8060: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8070: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8080: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
80b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
80c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
80d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
80e0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
80f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
8100: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8120: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8130: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 72 20  =0 );.    pIter 
8140: 3d 20 70 43 65 6c 6c 20 2b 20 67 65 74 56 61 72  = pCell + getVar
8150: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
8160: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 74 65  yload);.    pIte
8170: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
8180: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
8190: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
81a0: 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f  se if( pPage->no
81b0: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61  Payload ){.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
81d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
81e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
81f0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8200: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8210: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8220: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ;.    pInfo->nPa
8230: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70  yload = 0;.    p
8240: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
8250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8260: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
8270: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8280: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
82a0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
82b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
82c0: 65 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e;.    pIter += 
82d0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
82e0: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
82f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8300: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
8310: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8320: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8330: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
8340: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
8350: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
8360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
8380: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
8390: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83a0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
83b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
83c0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
83d0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
83e0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
83f0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
8400: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
8410: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
8420: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
8430: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8440: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8450: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
8460: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8470: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
8480: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
8490: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
84a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
84b0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
84c0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
84d0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
84e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
84f0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8500: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8510: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8520: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
8530: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
8540: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
8550: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
8560: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
8570: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
8580: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8590: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
85a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
85b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
85c0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
85d0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
85e0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
85f0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8600: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
8610: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8620: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
8630: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
8640: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8650: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8660: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8670: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
8680: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
8690: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
86a0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
86b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
86c0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
86d0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
86e0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
86f0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8700: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
8710: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
8720: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
8730: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8740: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8750: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8760: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8770: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8780: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8790: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
87a0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
87b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
87c0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
87d0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
87e0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
87f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8800: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8810: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8820: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8830: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8840: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8850: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
8860: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8870: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8880: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8890: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
88b0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
88c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
88d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
88e0: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
88f0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8910: 65 6c 6c 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  ell);.    pInfo-
8920: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
8930: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
8940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8960: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8970: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8980: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8990: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
89a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
89c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
89d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
89e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
89f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8a10: 2f 0a 29 7b 0a 20 20 62 74 72 65 65 50 61 72 73  /.){.  btreePars
8a20: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8a30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a40: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8a60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8a70: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8a80: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8a90: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8aa0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8ab0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8ac0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8ad0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8ae0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8af0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8b00: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8b10: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
8b20: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
8b30: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
8b40: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8b50: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
8b60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8b70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8b80: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
8b90: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
8ba0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
8bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
8bc0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
8bd0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
8c00: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
8c10: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
8c20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
8c50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
8c60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8c70: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
8c80: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8c90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8ca0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8cb0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
8cc0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
8cd0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8ce0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8cf0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8d00: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8d10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8d20: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8d30: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8d40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8d50: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8d60: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8d70: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
8d80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
8d90: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
8da0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8db0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
8dc0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
8dd0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61   if( pPage->noPa
8de0: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 45 6e  yload ){.    pEn
8df0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8e00: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8e10: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
8e20: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 61  er<pEnd );.    a
8e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8e40: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 31 36  .    return (u16
8e60: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8e70: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20  ;.  }.  nSize = 
8e80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
8e90: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
8ea0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
8eb0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
8ec0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
8ee0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
8ef0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f00: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
8f10: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
8f30: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
8f40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8f50: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8f60: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8f70: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8f80: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8f90: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8fa0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8fb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8fc0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8fd0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8fe0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8ff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9000: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
9010: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
9020: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
9030: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
9040: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9050: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
9060: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9070: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9080: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
9090: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
90a0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
90b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
90c0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
90d0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
90e0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
90f0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9110: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
9120: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9130: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
9140: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
9150: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
9160: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9170: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
9180: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9190: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
91b0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
91c0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
91d0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
91e0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
91f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
9200: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
9210: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
9220: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9230: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9240: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
9250: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
9260: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
9270: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
9280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9290: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
92a0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
92b0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
92c0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
92d0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
92e0: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
92f0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
9300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9310: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
9320: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9330: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9340: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
9350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9370: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
9380: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
9390: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
93a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
93b0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
93c0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
93d0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
93e0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
93f0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9410: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9420: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
9430: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9440: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
9450: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9460: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
9470: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
9480: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
9490: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
94a0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
94b0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
94c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
94d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
94e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
94f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
9500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
9510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
9520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
9530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
9540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
9550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
9560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
9570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
9580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
9590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
95a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
95b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
95c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
95d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
95e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
95f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
9600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
9610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
9620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9630: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
9640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
9650: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
9660: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
9670: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
9680: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
9690: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
96a0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
96b0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
96c0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
96d0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
96e0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
96f0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
9700: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
9710: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
9720: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
9730: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
9740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9750: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
9760: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9770: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
97d0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
97e0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
97f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9800: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
9810: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
9820: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9830: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9840: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
9850: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
9860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9870: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
9880: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
9890: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
98b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
98c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
98d0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
9900: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9940: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
9950: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9960: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
9970: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
9980: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
9990: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
99a0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
99b0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
99c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
99d0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
99e0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
99f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9a00: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9a10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9a20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
9a30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
9a40: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
9a50: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9a60: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9a70: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
9a80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9a90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9aa0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9ab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9ae0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9af0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9b00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9b10: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9b20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9b40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9b50: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
9b60: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
9b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
9b80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9b90: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
9ba0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
9bb0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
9bc0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9bd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9be0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9bf0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9c00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9c10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9c20: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
9c30: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
9c40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
9c50: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9c60: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9c70: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9c80: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9ca0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9cb0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9cc0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9cd0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ce0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9cf0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
9d00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d10: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
9d40: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
9d50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9d60: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9d70: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
9d80: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9d90: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9da0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9db0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9dc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9dd0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9de0: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
9df0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
9e00: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
9e10: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
9e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9e30: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9e40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9e50: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
9e60: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
9e70: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
9e80: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
9e90: 65 50 74 72 28 70 50 61 67 65 2c 20 26 73 72 63  ePtr(pPage, &src
9ea0: 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20  [pc]);.    cbrk 
9eb0: 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66  -= size;.#if def
9ec0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9ed0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
9ee0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20  _CHECK).    if( 
9ef0: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
9f00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9f10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f20: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  KPT;.    }.#else
9f30: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9f40: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
9f50: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
9f60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9f70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9f80: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
9fa0: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
9fb0: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c  ze && cbrk>=iCel
9fc0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
9fd0: 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a  stcase( cbrk+siz
9fe0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
9ff0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
a000: 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  c+size==usableSi
a010: 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ze );.    put2by
a020: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
a030: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30  .    if( temp==0
a040: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b   ){.      int x;
a050: 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d  .      if( cbrk=
a060: 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =pc ) continue;.
a070: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c        temp = sql
a080: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
a090: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
a0a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20  Pager);.      x 
a0b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a0c0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
a0d0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c  memcpy(&temp[x],
a0e0: 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b   &data[x], (cbrk
a0f0: 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20  +size) - x);.   
a100: 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20     src = temp;. 
a110: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
a120: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72  &data[cbrk], &sr
a130: 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  c[pc], size);.  
a140: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
a150: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
a160: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a170: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
a180: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
a190: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
a1a0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
a1b0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
a1c0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
a1d0: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
a1e0: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
a1f0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a200: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
a210: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
a220: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
a230: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
a240: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
a250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a260: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
a270: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a280: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
a290: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
a2a0: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
a2b0: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
a2c0: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
a2d0: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
a2e0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
a2f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a300: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
a310: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
a320: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
a330: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
a340: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
a350: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
a360: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
a370: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
a380: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
a390: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
a3a0: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
a3b0: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
a3c0: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
a3d0: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
a3e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a3f0: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
a400: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
a410: 20 73 6c 6f 74 20 6f 66 20 61 74 20 6c 65 61 73   slot of at leas
a420: 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 73  t nByte bytes is
a430: 20 66 6f 75 6e 64 20 62 75 74 20 63 61 6e 6e 6f   found but canno
a440: 74 20 62 65 20 75 73 65 64 20 62 65 63 61 75 73  t be used becaus
a450: 65 20 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  e .** there are 
a460: 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73 74  already at least
a470: 20 36 30 20 66 72 61 67 6d 65 6e 74 65 64 20 62   60 fragmented b
a480: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
a490: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
a4a0: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
a4b0: 69 66 20 70 62 44 65 66 72 61 67 20 70 61 72 61  if pbDefrag para
a4c0: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
a4d0: 4c 2c 20 73 65 74 20 2a 70 62 44 65 66 72 61 67  L, set *pbDefrag
a4e0: 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   to true..*/.sta
a4f0: 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64  tic u8 *pageFind
a500: 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Slot(MemPage *pP
a510: 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  g, int nByte, in
a520: 74 20 2a 70 52 63 2c 20 69 6e 74 20 2a 70 62 44  t *pRc, int *pbD
a530: 65 66 72 61 67 29 7b 0a 20 20 63 6f 6e 73 74 20  efrag){.  const 
a540: 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
a550: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  drOffset;.  u8 *
a560: 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
a570: 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74  Pg->aData;.  int
a580: 20 69 41 64 64 72 3b 0a 20 20 69 6e 74 20 70 63   iAddr;.  int pc
a590: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
a5a0: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
a5b0: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 66 6f  sableSize;..  fo
a5c0: 72 28 69 41 64 64 72 3d 68 64 72 2b 31 3b 20 28  r(iAddr=hdr+1; (
a5d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
a5e0: 44 61 74 61 5b 69 41 64 64 72 5d 29 29 3e 30 3b  Data[iAddr]))>0;
a5f0: 20 69 41 64 64 72 3d 70 63 29 7b 0a 20 20 20 20   iAddr=pc){.    
a600: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
a610: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a620: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
a630: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
a640: 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31  -OF: R-06866-391
a650: 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72  25 Freeblocks ar
a660: 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74  e always connect
a670: 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20  ed in order of. 
a680: 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67     ** increasing
a690: 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20   offset. */.    
a6a0: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a6b0: 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b  e-4 || pc<iAddr+
a6c0: 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  4 ){.      *pRc 
a6d0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
a6e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
a6f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
a700: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
a710: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
a720: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
a730: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
a740: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
a750: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
a760: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a770: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
a780: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
a790: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
a7a0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
a7b0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
a7c0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
a7d0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
a7e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65  ]);.    if( size
a7f0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
a800: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a810: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 74 65 73  nByte;.      tes
a820: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
a830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a840: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
a850: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
a860: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
a870: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
a880: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
a890: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
a8a0: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
a8b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a8c0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
a8d0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
a8e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a8f0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30  aData[hdr+7]>=60
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a910: 28 20 70 62 44 65 66 72 61 67 20 29 20 2a 70 62  ( pbDefrag ) *pb
a920: 44 65 66 72 61 67 20 3d 20 31 3b 0a 20 20 20 20  Defrag = 1;.    
a930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
a940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a950: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a960: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a970: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a990: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
a9a0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
a9b0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
a9c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
a9d0: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
a9e0: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
a9f0: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
aa00: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
aa10: 20 7d 65 6c 73 65 20 69 66 28 20 70 63 20 3c 20   }else if( pc < 
aa20: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
aa30: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
aa40: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
aa50: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
aa60: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
aa70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
aa80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aa90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aaa0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
aab0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
aac0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
aad0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
aae0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
aaf0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
ab00: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
ab10: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
ab20: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
ab30: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
ab40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ab50: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
ab60: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
ab80: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ab90: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aba0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
abb0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
abc0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
abd0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
abe0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
abf0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
ac00: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ac10: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ac20: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ac30: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ac40: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ac50: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ac60: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ac70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ac80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ac90: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
aca0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
acb0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
acc0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
acd0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
ace0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
acf0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
ad00: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ad10: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ad20: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ad30: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ad40: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ad50: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ad60: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ad70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ad80: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ad90: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
ada0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
adb0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
adc0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
add0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
ade0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
adf0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
ae00: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ae10: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ae20: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ae30: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ae40: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ae50: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ae60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ae70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ae80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ae90: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
aea0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
aeb0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
aec0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
aed0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
aee0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
af10: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
af20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
af30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
af40: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
af50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
af60: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
af70: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
af80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
af90: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
afa0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
afb0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
afc0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
afd0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
afe0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aff0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b000: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
b010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b020: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b030: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b040: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b050: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
b060: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
b070: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
b080: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
b090: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
b0a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b0b0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b0c0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
b0d0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
b0e0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
b0f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b100: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b110: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b120: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b130: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b140: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b150: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b160: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b170: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b180: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b190: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b1a0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b1b0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b1c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b1d0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b1e0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b1f0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b200: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b210: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b220: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b230: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b240: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b250: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b260: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b270: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b280: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b290: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b2a0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b2b0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b2c0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b2d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b2e0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b2f0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b300: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b310: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b320: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b330: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b340: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b350: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b360: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b370: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b380: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b390: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b3a0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b3b0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b3c0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b3d0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b3e0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b3f0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b400: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b410: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b420: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b430: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b440: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b450: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b460: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b470: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b480: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b490: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b4a0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b4b0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b4c0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b4d0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b4e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b4f0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b500: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b510: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b520: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b530: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b540: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b550: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b560: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b570: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b580: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b590: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b5a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b5b0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b5c0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b5d0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b5e0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b5f0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b600: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b610: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b620: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b630: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b640: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b650: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b660: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b670: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b680: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b690: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b6a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b6b0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b6c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b6d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b6e0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b6f0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b700: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b710: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b720: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b730: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b740: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b750: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b760: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b770: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b780: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b790: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b7a0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b7b0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b7c0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b7d0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b7e0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b7f0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b800: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b810: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b820: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b830: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b840: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b850: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b860: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b870: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b880: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b890: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b8a0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b8b0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b8c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b8d0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b8e0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b8f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b900: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b910: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b920: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b930: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b940: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b950: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b960: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b970: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b980: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b990: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b9a0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b9b0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b9c0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b9d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b9e0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b9f0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
ba00: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
ba10: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
ba20: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
ba30: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
ba40: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
ba50: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
ba60: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
ba70: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
ba80: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
ba90: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
baa0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
bab0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
bac0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
bad0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
bae0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
baf0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
bb00: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
bb10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bb20: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
bb30: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
bb40: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
bb50: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
bb60: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
bb70: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
bb80: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bbb0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bbc0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bbd0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bc00: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bc10: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc40: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bc50: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bc60: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
bc90: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bca0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bcb0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bcc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bcd0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bce0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bcf0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bd00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bd10: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bd20: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bd30: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bd40: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bd50: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bd60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bd70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bd80: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bd90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bda0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bdb0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bdc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bdd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bde0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bdf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
be00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
be10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
be20: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
be30: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
be40: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
be50: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
be60: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
be70: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
be80: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
be90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
bea0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
beb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
bec0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
bed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
bee0: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
bef0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
bf00: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
bf10: 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20  ( iStart<=iLast 
bf20: 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  );..  /* Overwri
bf30: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
bf40: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
bf50: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
bf60: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70  e_delete.  ** op
bf70: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
bf80: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
bf90: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
bfa0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
bfb0: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
bfc0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
bfd0: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , iSize);.  }.. 
bfe0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
bff0: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
c000: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
c010: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
c020: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
c030: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
c040: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
c050: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
c060: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c070: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
c080: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
c090: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
c0a0: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
c0b0: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
c0c0: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
c0d0: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
c0e0: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
c0f0: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
c100: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
c110: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
c120: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
c130: 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42  r]))>0 && iFreeB
c140: 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  lk<iStart ){.   
c150: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
c160: 69 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20  iPtr+4 ) return 
c170: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c180: 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20  KPT;.      iPtr 
c190: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
c1a0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
c1b0: 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72  lk>iLast ) retur
c1c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c1d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
c1e0: 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
c1f0: 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
c200: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
c210: 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
c220: 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
c230: 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
c240: 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
c250: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
c260: 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
c270: 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
c280: 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 69  s of a pointer i
c290: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
c2a0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
c2b0: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
c2c0: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
c2d0: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
c2e0: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
c2f0: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
c300: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
c310: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
c320: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
c330: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
c340: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
c350: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c360: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c370: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
c380: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
c390: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
c3a0: 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  ]);.      iSize 
c3b0: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
c3c0: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
c3d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c3e0: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
c3f0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
c400: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
c410: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
c420: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
c430: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
c440: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
c450: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
c460: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
c470: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
c480: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
c490: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
c4a0: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
c4b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
c4c0: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
c4d0: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
c4e0: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
c4f0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
c500: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
c510: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
c520: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
c530: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
c540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c550: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
c560: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
c570: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
c580: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c590: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
c5a0: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
c5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c5c0: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
c5d0: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
c5e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c5f0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
c600: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
c610: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
c620: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
c630: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
c640: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
c650: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
c660: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
c670: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
c680: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
c690: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
c6a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
c6b0: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
c6c0: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
c6d0: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
c6e0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
c6f0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
c700: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c710: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
c720: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
c730: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
c740: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
c750: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
c760: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
c770: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
c780: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
c790: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
c7a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
c7b0: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
c7c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c7d0: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
c7e0: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c7f0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
c800: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
c810: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
c820: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
c830: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c840: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
c850: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
c860: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c870: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
c880: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
c890: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
c8a0: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
c8b0: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
c8c0: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
c8d0: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
c8e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
c8f0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
c900: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
c910: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
c920: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
c930: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
c940: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
c950: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
c960: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
c970: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
c980: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
c990: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
c9a0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
c9b0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
c9c0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
c9d0: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
c9e0: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
c9f0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
ca00: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
ca10: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
ca20: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
ca30: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ca40: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
ca50: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
ca60: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
ca70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ca80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ca90: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
caa0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
cab0: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
cac0: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
cad0: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
cae0: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
caf0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
cb00: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
cb10: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
cb20: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
cb30: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
cb40: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
cb50: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
cb60: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
cb70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36  IDENCE-OF: R-036
cb80: 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65  40-13415 A value
cb90: 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20   of 5 means the 
cba0: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
cbb0: 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ior.    ** table
cbc0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
cbe0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
cbf0: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
cc00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cc10: 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41   R-20501-61796 A
cc20: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61   value of 13 mea
cc30: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
cc40: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62   leaf.    ** tab
cc50: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cc60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cc70: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cc80: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
cc90: 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
cca0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
ccb0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
ccc0: 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e 6c  yLeaf = pPage->l
ccd0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
cce0: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50 61  noPayload = !pPa
ccf0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
cd00: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
cd10: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
cd20: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
cd30: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
cd40: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
cd50: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
cd60: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
cd70: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
cd80: 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75  225-53936 A valu
cd90: 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65  e of 2 means the
cda0: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
cdb0: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65  rior.    ** inde
cdc0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
cdd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
cde0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
cdf0: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
ce00: 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31  CE-OF: R-16571-1
ce10: 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20  1615 A value of 
ce20: 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  10 means the pag
ce30: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
ce40: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
ce50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
ce60: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
ce70: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
ce80: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
ce90: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
cea0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
ceb0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
cec0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  >noPayload = 0;.
ced0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
cee0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
cef0: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
cf00: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
cf10: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
cf20: 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
cf30: 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35  CE-OF: R-47608-5
cf40: 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76  6469 Any other v
cf50: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74  alue for the b-t
cf60: 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73  ree page type is
cf70: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
cf80: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
cf90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
cfa0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
cfb0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
cfc0: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
cfd0: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
cfe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cff0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
d000: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
d010: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
d020: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
d030: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d040: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d050: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
d060: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
d070: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
d080: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
d090: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
d0a0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
d0b0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
d0c0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
d0d0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
d0e0: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
d0f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
d100: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
d110: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
d120: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
d130: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
d140: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d150: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
d160: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
d170: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
d180: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
d190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d1a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d1b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d1c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d1d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
d1e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
d1f0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
d200: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
d210: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
d220: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d230: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
d250: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
d260: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d270: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d280: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
d290: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d2a0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
d2b0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
d2c0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
d2d0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
d2e0: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
d300: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
d310: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
d320: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
d330: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
d340: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
d350: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
d360: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
d370: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
d380: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
d390: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
d3a0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
d3b0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
d3c0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
d3d0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
d3e0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
d3f0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
d400: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
d410: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
d420: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
d430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d440: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
d450: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
d460: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
d470: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d480: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
d490: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d4a0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
d4b0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
d4c0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
d4d0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
d4e0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
d4f0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
d500: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
d510: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
d520: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
d530: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
d540: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
d550: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
d560: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
d570: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20  ->aData;.    /* 
d580: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
d590: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
d5a0: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
d5b0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
d5c0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ing.    ** the b
d5d0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
d5e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f   */.    if( deco
d5f0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
d600: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
d610: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d620: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
d630: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
d640: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
d650: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
d660: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
d670: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
d680: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
d690: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
d6a0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
d6b0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
d6c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
d6d0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
d6e0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
d6f0: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61   = hdr + 8 + pPa
d700: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
d710: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
d720: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
d730: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
d740: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
d750: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
d760: 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  t];.    /* EVIDE
d770: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
d780: 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
d790: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
d7a0: 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
d7b0: 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  s.    ** the sta
d7c0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
d7d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
d7e0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
d7f0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
d800: 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64    ** interpreted
d810: 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20   as 65536. */.  
d820: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
d830: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
d840: 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56  r+5]);.    /* EV
d850: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
d860: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
d870: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
d880: 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
d890: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
d8a0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
d8b0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  e page. */.    p
d8c0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
d8d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d8e0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
d8f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
d900: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
d910: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
d920: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
d930: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
d940: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
d950: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
d960: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d970: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
d980: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
d990: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
d9a0: 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  t) );.    /* EVI
d9b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38  DENCE-OF: R-2408
d9c0: 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67  9-57979 If a pag
d9d0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
d9e0: 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e  lls (which is on
d9f0: 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  ly.    ** possib
da00: 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61  le for a root pa
da10: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ge of a table th
da20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  at contains no r
da30: 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20  ows) then the.  
da40: 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
da50: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
da60: 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
da70: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
da80: 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  nus the.    ** b
da90: 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
daa0: 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
dab0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
dac0: 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73  ell>0 || top==us
dad0: 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52  ableSize || CORR
dae0: 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f  UPT_DB );..    /
daf0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
db00: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
db10: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
db20: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
db30: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
db40: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
db50: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
db60: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
db70: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
db80: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
db90: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
dba0: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
dbb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
dbc0: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
dbd0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
dbe0: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
dbf0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
dc00: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
dc10: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
dc20: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
dc30: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
dc40: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
dc50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
dc60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
dc70: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
dc80: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
dc90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
dcb0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
dcc0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
dcd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
dce0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
dcf0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
dd00: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
dd10: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
dd20: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
dd30: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
dd40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
dd50: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
dd60: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
dd70: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
dd80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
dd90: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
dda0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ddb0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
ddc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
ddd0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
dde0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
ddf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
de00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
de10: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
de20: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
de30: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
de40: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
de50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
de60: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
de70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
de80: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
de90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
dea0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
deb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dec0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ded0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
dee0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
def0: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
df00: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
df10: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
df20: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
df30: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
df40: 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
df50: 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
df60: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
df70: 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   1 gives the.   
df80: 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
df90: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
dfa0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
dfb0: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
dfc0: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20  e are no.    ** 
dfd0: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
dfe0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
dff0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
e000: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
e010: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20  [hdr+7] + top;  
e020: 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f  /* Init nFree to
e030: 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66   non-freeblock f
e040: 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ree space */.   
e050: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
e060: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
e070: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
e080: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
e090: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
e0a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
e0b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30  ENCE-OF: R-55530
e0c0: 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c  -52930 In a well
e0d0: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
e0e0: 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a  age, there will.
e0f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e100: 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
e110: 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
e120: 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
e130: 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
e140: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65        ** Or, the
e150: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66   freeblock is of
e160: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
e170: 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f   page.        */
e180: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e190: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e1a0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
e1b0: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
e1c0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
e1d0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
e1e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
e1f0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
e200: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
e210: 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
e220: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
e230: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
e240: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
e250: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
e260: 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
e270: 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20  st byte of.     
e280: 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62     ** the free-b
e290: 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e  lock must lie on
e2a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
e2b0: 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
e2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e2d0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
e2e0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
e2f0: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
e300: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
e310: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e320: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
e330: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
e340: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
e350: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
e360: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
e370: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
e380: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
e390: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
e3a0: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
e3b0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e3c0: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
e3d0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
e3e0: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
e3f0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
e400: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
e410: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
e420: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
e430: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
e440: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
e450: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
e460: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
e470: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
e480: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
e490: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
e4a0: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
e4b0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
e4c0: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
e4d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e4e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e4f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
e500: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
e510: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
e520: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
e530: 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  st);.    pPage->
e540: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
e550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e560: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
e570: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
e580: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
e590: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
e5a0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
e5b0: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
e5c0: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
e5d0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e5e0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
e5f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e600: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
e610: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
e620: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
e630: 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
e640: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
e650: 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
e660: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e670: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
e680: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
e690: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
e6a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e6b0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
e6c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
e6d0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
e6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e6f0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
e700: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
e710: 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
e720: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
e730: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
e740: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
e750: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e760: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e770: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
e780: 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
e790: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
e7a0: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
e7b0: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
e7c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
e7d0: 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
e7e0: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
e7f0: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
e800: 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26  = hdr + ((flags&
e810: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31  PTF_LEAF)==0 ? 1
e820: 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74  2 : 8);.  memset
e830: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
e840: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
e850: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
e860: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e870: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
e880: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
e890: 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ee = (u16)(pBt->
e8a0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
e8b0: 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  st);.  decodeFla
e8c0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
e8d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
e8e0: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
e8f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
e900: 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
e910: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
e920: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
e930: 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
e940: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
e950: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
e960: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
e970: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
e980: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
e990: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
e9a0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
e9b0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
e9c0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
e9d0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
e9e0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
e9f0: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
ea00: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
ea10: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
ea20: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
ea30: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
ea40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
ea50: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
ea60: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
ea70: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
ea80: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
ea90: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
eaa0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
eab0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
eac0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
ead0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
eae0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
eaf0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
eb00: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
eb10: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
eb20: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
eb30: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
eb40: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
eb50: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
eb60: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
eb70: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
eb80: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
eb90: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
eba0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
ebb0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
ebc0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
ebd0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
ebe0: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
ebf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
ec00: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
ec10: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
ec20: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
ec30: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
ec40: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
ec50: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
ec60: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
ec70: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
ec80: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
ec90: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
eca0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
ecb0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
ecc0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
ecd0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
ece0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
ecf0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
ed00: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
ed10: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
ed20: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
ed30: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
ed40: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
ed50: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
ed60: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
ed70: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
ed80: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
ed90: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
eda0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
edb0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
edc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
edd0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
ede0: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
edf0: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
ee00: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
ee10: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
ee20: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
ee30: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
ee40: 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
ee50: 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
ee60: 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
ee70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
ee80: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
ee90: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
eea0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
eeb0: 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
eec0: 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
eed0: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
eee0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eef0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ef00: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
ef10: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
ef20: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
ef30: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
ef40: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
ef50: 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
ef60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
ef70: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
ef80: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
ef90: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
efa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
efc0: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
efd0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
efe0: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
eff0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
f000: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
f010: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
f020: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
f030: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
f040: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
f050: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
f060: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
f070: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
f080: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
f090: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
f0a0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
f0b0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
f0c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f0d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
f0e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
f0f0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
f100: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
f110: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
f120: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
f130: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
f140: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
f150: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
f160: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
f170: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
f180: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
f190: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f1a0: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
f1b0: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
f1c0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
f1d0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
f1e0: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
f1f0: 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
f200: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
f210: 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
f220: 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
f230: 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
f240: 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
f250: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
f260: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
f270: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
f280: 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
f290: 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d  ge)&0x8000000)==
f2a0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
f2b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
f2c0: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
f2d0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
f2e0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
f2f0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
f300: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
f310: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
f320: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
f330: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
f340: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
f350: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
f360: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
f370: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f380: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
f390: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
f3a0: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
f3b0: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
f3c0: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
f3d0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
f3e0: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
f3f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
f400: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
f410: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
f420: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
f430: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
f440: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
f450: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
f480: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
f490: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
f4a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
f4b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
f4c0: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
f4d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  e */.  int bRead
f4e0: 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  only            
f4f0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
f500: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72 20  GET_READONLY or 
f510: 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  0 */.){.  int rc
f520: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f530: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f550: 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e 6c  assert( bReadonl
f560: 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  y==PAGER_GET_REA
f570: 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f 6e  DONLY || bReadon
f580: 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ly==0 );..  if( 
f590: 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
f5a0: 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
f5b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
f5c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
f5d0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  e{.    rc = btre
f5e0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
f5f0: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65 61  no, ppPage, bRea
f600: 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20  donly);.    if( 
f610: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f620: 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
f630: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
f640: 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
f650: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
f660: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f670: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
f680: 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
f690: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
f6a0: 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61   }.  }..  testca
f6b0: 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
f6c0: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
f6d0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
f6e0: 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
f6f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f700: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
f710: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
f720: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
f730: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
f740: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
f750: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
f760: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
f770: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
f780: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
f790: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
f7a0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
f7b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f7c0: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
f7d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
f7e0: 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ge!=0 );.    ass
f7f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f800: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
f810: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
f820: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
f830: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f840: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
f850: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
f860: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
f870: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f880: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f890: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f8a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
f8b0: 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
f8c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
f8d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  .  }.}../*.** Du
f8e0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
f8f0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
f900: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
f910: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
f920: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
f930: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
f940: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
f950: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
f960: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
f970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
f980: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
f990: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
f9a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
f9b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f9c0: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
f9d0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
f9e0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
f9f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
fa00: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
fa10: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
fa20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fa30: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
fa40: 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
fa50: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
fa60: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
fa70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
fa80: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
fa90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
faa0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
fab0: 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
fac0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
fad0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
fae0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
faf0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
fb00: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
fb10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
fb20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fb30: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
fb40: 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
fb50: 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
fb60: 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
fb70: 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
fb80: 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
fb90: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
fba0: 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
fbb0: 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
fbc0: 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
fbd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
fbe0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
fbf0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
fc00: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
fc10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
fc20: 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
fc30: 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
fc40: 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
fc50: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
fc60: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
fc70: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
fc80: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
fc90: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
fca0: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
fcb0: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
fcc0: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
fcd0: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
fce0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
fcf0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
fd00: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
fd10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
fd20: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
fd30: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
fd40: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
fd50: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
fd60: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
fd70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fd80: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
fd90: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
fda0: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
fdb0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fdc0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
fdd0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
fde0: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
fdf0: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
fe00: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
fe10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
fe20: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
fe30: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
fe40: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
fe50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
fe60: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
fe70: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
fe80: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
fe90: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
fea0: 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
feb0: 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
fec0: 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
fed0: 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
fee0: 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
fef0: 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
ff00: 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
ff10: 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
ff20: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
ff30: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
ff40: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
ff50: 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
ff60: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
ff70: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
ff80: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
ff90: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
ffa0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ffb0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
ffc0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
ffd0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
ffe0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
fff0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
10000 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
10010 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
10020 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
10030 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
10040 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
10050 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
10060 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
10070 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
10080 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
10090 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
100a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
100b0 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
100c0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
100d0 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
100e0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
100f0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
10100 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
10110 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
10120 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
10130 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
10140 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10150 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
10160 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
10170 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
10180 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
10190 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
101a0 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
101b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
101c0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
101d0 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
101e0 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
101f0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
10200 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10210 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
10220 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
10230 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
10240 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10250 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
10260 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
10270 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
10280 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
10290 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
102a0 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
102b0 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
102c0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
102d0 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
102e0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
102f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10300 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
10310 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
10320 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
10330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10350 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
10360 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
10370 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
10380 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10390 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
103a0 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
103b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
103c0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
103d0 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
103e0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
103f0 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
10400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10410 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
10420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
10430 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
10440 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
10450 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10460 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
10470 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
10480 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
10490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
104a0 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
104b0 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
104c0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
104d0 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
104e0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
104f0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
10500 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
10510 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
10520 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
10530 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
10540 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
10550 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
10560 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
10570 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
10580 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
10590 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
105a0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
105b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
105c0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
105d0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
105e0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
105f0 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
10600 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
10610 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
10620 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
10650 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
10660 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
10690 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
106a0 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
106b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
106c0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
106d0 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
106e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
106f0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
10700 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10710 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
10720 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
10730 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
10740 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
10750 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
10760 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
10770 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
10780 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
10790 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
107a0 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
107b0 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
107c0 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
107d0 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
107e0 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
107f0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
10800 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
10810 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
10820 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
10830 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
10840 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
10850 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
10860 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
10870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
10880 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10890 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
108a0 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
108b0 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
108c0 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
108d0 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
108e0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
108f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
10900 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
10910 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10920 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
10930 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
10940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10950 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
10960 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
10970 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
10980 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10990 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
109a0 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
109b0 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
109c0 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
109d0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
109e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
109f0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
10a00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10a10 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
10a20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
10a30 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
10a40 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
10a50 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
10a60 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
10a70 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
10a80 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
10a90 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
10aa0 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d    if( isTempDb==
10ab0 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30  0 && (isMemdb==0
10ac0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51   || (vfsFlags&SQ
10ad0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d  LITE_OPEN_URI)!=
10ae0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66  0) ){.    if( vf
10af0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
10b00 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
10b10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
10b20 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
10b30 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
10b40 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e  ame)+1;.      in
10b50 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
10b60 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
10b70 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
10b80 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
10b90 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
10ba0 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  MAX(nFullPathnam
10bb0 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  e,nFilename));. 
10bc0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
10bd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
10be0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
10bf0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
10c00 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
10c10 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
10c20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10c30 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
10c40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10c60 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
10c70 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
10c80 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
10c90 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
10ca0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
10cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
10cd0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
10ce0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
10d20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
10d30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
10d40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d50 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10d60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10d70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
10da0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
10db0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
10dc0 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
10dd0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10de0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10df0 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
10e00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10e10 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
10e20 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
10e30 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
10e40 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10e50 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10e60 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
10e70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10e80 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
10e90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
10ea0 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
10eb0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10ec0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
10ed0 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
10ee0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
10ef0 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
10f00 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
10f10 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
10f20 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
10f30 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
10f40 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
10f70 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
10f80 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
10f90 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
10fa0 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
10fb0 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
10fc0 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
10fd0 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
10fe0 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
10ff0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
11000 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
11010 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
11020 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
11030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11040 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11050 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
11060 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11070 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11080 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
11090 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
110a0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
110b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
110c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
110d0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
110e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
110f0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
11100 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11120 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
11130 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
11140 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
11150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11160 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11170 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11180 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
11190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
111a0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
111b0 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
111c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
111d0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
111e0 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
111f0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
11200 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
11210 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
11220 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
11230 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
11240 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
11250 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
11260 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
11270 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
11280 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
11290 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
112a0 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
112b0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
112c0 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
112d0 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
112e0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
112f0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
11300 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
11310 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
11320 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
11330 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
11340 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
11350 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
11360 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
11370 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
11380 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
11390 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
113a0 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
113b0 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
113c0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
113d0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
113e0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
113f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11400 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
11410 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
11420 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
11430 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
11440 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
11450 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
11460 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
11470 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
11480 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
11490 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
114a0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
114b0 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
114c0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
114d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
114e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
114f0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
11500 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11510 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
11520 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
11530 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
11560 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
11570 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
11580 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
11590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
115b0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
115c0 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
115d0 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
115e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
115f0 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
11600 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
11610 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
11620 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
11630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11640 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
11650 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
11660 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
11670 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
11680 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
11690 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
116a0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
116b0 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
116c0 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
116d0 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
116e0 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
116f0 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
11700 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
11710 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
11720 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11730 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
11740 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
11750 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
11760 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
11770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
11780 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
11790 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
117a0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
117b0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
117c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
117d0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
117e0 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
117f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11800 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
11810 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
11820 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
11830 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
11840 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
11850 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
11860 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
11870 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
11880 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
11890 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
118a0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
118b0 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
118c0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
118d0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
118e0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
118f0 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
11900 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
11910 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
11920 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
11930 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
11940 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
11950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11960 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
11970 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
11980 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
11990 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
119a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
119b0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
119c0 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
119d0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
119e0 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
119f0 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
11a00 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
11a10 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
11a20 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
11a30 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
11a40 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
11a50 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
11a60 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
11a70 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
11a80 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
11a90 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
11aa0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
11ab0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
11ac0 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
11ad0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
11ae0 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
11af0 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
11b00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
11b10 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
11b20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
11b30 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
11b40 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
11b50 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
11b60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
11b70 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
11b80 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
11b90 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
11ba0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
11bb0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
11bc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
11bd0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
11be0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
11bf0 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
11c00 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
11c10 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
11c20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
11c30 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
11c40 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
11c50 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
11c60 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
11c70 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
11c80 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
11c90 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
11ca0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
11cb0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
11cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11cd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11ce0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
11cf0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
11d00 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
11d10 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
11d20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
11d30 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
11d40 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
11d50 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
11d60 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
11d70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11d80 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11d90 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11da0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11db0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
11dc0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
11dd0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
11de0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
11df0 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
11e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
11e10 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
11e20 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
11e30 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
11e40 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
11e50 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11e60 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
11e70 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
11e80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
11e90 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
11ea0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
11eb0 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
11ec0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
11ed0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
11ee0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11ef0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
11f00 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
11f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
11f20 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
11f30 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
11f40 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   1;.      MUTEX_
11f50 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
11f60 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
11f70 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11f80 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
11f90 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
11fa0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
11fb0 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
11fc0 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
11fd0 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
11fe0 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
11ff0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
12000 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
12010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
12020 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
12030 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12040 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12050 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
12060 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
12070 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
12080 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
12090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
120a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
120b0 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
120c0 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
120d0 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
120e0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
120f0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
12100 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
12110 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12120 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
12130 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
12140 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12150 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
12160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12170 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12180 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
12190 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
121a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
121b0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
121c0 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
121d0 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
121e0 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
121f0 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
12200 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
12210 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
12220 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
12230 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
12240 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
12250 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
12260 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
12270 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
12280 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
12290 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
122a0 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
122b0 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
122c0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
122d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
122e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
122f0 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
12300 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
12310 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
12320 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
12330 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
12340 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
12350 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
12360 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
12370 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
12380 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
12390 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
123a0 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
123b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
123c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
123d0 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
123e0 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
123f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
12400 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
12410 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
12420 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12430 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
12440 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
12450 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
12460 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
12470 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
12480 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
12490 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
124a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
124b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
124c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
124d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
124e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
124f0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
12500 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
12510 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
12520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12530 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
12540 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
12550 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
12560 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
12570 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12580 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
12590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
125a0 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
125b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
125c0 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
125d0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
125e0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
125f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
12600 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
12610 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
12620 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
12630 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
12640 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
12650 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
12660 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
12670 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
12680 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
12690 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
126a0 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
126b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
126c0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
126d0 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
126e0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
126f0 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
12700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12710 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
12720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12730 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
12740 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
12750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12760 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
12770 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12780 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
12790 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
127a0 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
127b0 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
127c0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
127d0 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
127e0 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
127f0 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
12800 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
12810 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
12820 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
12830 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
12840 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
12850 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
12860 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12870 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
12880 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
12890 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
128a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
128b0 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
128c0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
128d0 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
128e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
128f0 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
12900 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
12910 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12920 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
12930 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
12940 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
12950 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
12960 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
12970 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
12980 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12990 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
129a0 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
129b0 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
129c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
129d0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
129e0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
129f0 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
12a00 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
12a10 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
12a20 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
12a30 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
12a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
12a50 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
12a60 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
12a70 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
12a80 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
12a90 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
12aa0 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
12ab0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
12ac0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
12ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12ae0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
12af0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
12b00 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
12b10 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
12b20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
12b30 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
12b40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12b50 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
12b60 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
12b70 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
12b80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12b90 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
12ba0 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
12bb0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
12bc0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
12bd0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
12be0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
12bf0 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
12c00 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
12c10 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
12c20 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74  tes with a 4-byt
12c30 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c  e prefix for a l
12c40 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69  eft-child.** poi
12c50 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
12c60 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
12c70 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
12c80 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
12c90 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
12ca0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
12cb0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
12cc0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
12cd0 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
12ce0 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
12cf0 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
12d00 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
12d10 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
12d20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
12d30 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
12d40 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
12d50 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
12d60 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
12d70 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
12d80 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
12d90 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
12da0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
12db0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
12dc0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
12dd0 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
12de0 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
12df0 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
12e00 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
12e10 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
12e20 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
12e30 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
12e40 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
12e50 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
12e60 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
12e70 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
12e80 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
12e90 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
12ea0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
12eb0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
12ec0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
12ed0 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
12ee0 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
12ef0 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
12f00 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
12f10 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
12f20 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
12f30 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
12f40 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
12f50 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
12f60 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
12f70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20   space here..   
12f80 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a   **.    ** Also:
12f90 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62    Provide four b
12fa0 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69  ytes of initiali
12fb0 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65  zed space before
12fc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69   the.    ** begi
12fd0 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61  nning of pTmpSpa
12fe0 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76  ce as an area av
12ff0 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65  ailable to prepe
13000 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  nd the.    ** le
13010 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ft-child pointer
13020 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
13030 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20  g of a cell..   
13040 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
13050 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
13060 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e      memset(pBt->
13070 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29  pTmpSpace, 0, 8)
13080 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d  ;.      pBt->pTm
13090 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20  pSpace += 4;.   
130a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
130b0 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
130c0 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
130d0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
130e0 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
130f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13100 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
13110 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
13120 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b  >pTmpSpace -= 4;
13130 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
13140 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70  Free(pBt->pTmpSp
13150 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ace);.    pBt->p
13160 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
13170 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
13180 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
13190 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
131a0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
131b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
131c0 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
131d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
131e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
131f0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
13200 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
13210 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
13220 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
13230 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
13240 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13250 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13260 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13270 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
13280 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
13290 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
132a0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
132b0 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
132c0 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
132d0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
132e0 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
132f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13300 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
13310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13320 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
13330 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
13340 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
13350 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
13360 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
13370 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
13380 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
13390 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
133a0 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
133b0 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
133c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
133d0 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
133e0 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
133f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13400 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
13410 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
13420 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
13430 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
13440 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
13450 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
13460 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
13470 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
13480 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
13490 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
134a0 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
134b0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
134c0 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
134d0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
134e0 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
134f0 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
13500 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
13510 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
13520 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
13530 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
13540 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
13550 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
13560 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
13570 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
13580 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
13590 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
135a0 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
135b0 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
135c0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
135d0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
135e0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
135f0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
13600 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
13610 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
13620 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
13630 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
13640 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
13650 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13660 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
13670 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
13680 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
13690 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
136a0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
136b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
136c0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
136d0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
136e0 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
136f0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
13700 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
13710 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
13720 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
13730 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
13740 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
13750 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
13760 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13770 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
13780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13790 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
137a0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
137b0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
137c0 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
137d0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
137e0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
137f0 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
13800 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
13810 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
13820 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
13830 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
13840 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
13850 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
13860 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
13870 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
13880 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
13890 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
138a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
138b0 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
138c0 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
138d0 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
138e0 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
138f0 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
13900 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
13910 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
13920 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
13930 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
13940 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
13950 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
13960 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
13970 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
13980 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
13990 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
139a0 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
139b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
139c0 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
139d0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
139e0 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
139f0 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
13a00 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
13a10 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
13a20 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
13a30 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
13a40 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
13a50 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
13a60 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
13a70 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
13a80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13a90 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13aa0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13ab0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13ac0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13ad0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13ae0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13af0 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
13b00 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
13b10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13b20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13b40 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13b50 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
13b60 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
13b70 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
13b80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13b90 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
13ba0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
13bb0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13bc0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
13bd0 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
13be0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
13bf0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
13c00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13c20 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
13c30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13c40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13c50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
13c60 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
13c70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
13c80 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
13c90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cb0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13cc0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
13cd0 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
13ce0 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
13cf0 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
13d00 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
13d10 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
13d20 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
13d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
13d40 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
13d50 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
13d60 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
13d70 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
13d80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
13d90 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
13da0 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
13db0 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
13dc0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
13dd0 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
13de0 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
13df0 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
13e00 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
13e10 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
13e20 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
13e30 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
13e40 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
13e50 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
13e60 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
13e70 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
13e80 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
13e90 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
13ea0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
13eb0 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
13ec0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
13ed0 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
13ee0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13ef0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
13f00 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
13f10 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
13f20 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
13f30 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
13f40 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
13f50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
13f60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
13f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13f80 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
13f90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
13fa0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13fb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
13fc0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
13fd0 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
13fe0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13ff0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
14010 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
14020 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
14030 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
14040 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
14050 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
14060 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
14070 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
14080 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
14090 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
140a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
140b0 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
140c0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
140d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
140e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
140f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14100 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
14110 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
14120 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14130 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
14140 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14150 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
14160 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
14170 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
14180 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14190 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
141a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
141b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
141c0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
141d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
141e0 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
141f0 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
14200 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
14210 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
14220 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
14230 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
14240 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
14250 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
14260 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
14270 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
14280 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
14290 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
142a0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
142b0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
142c0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
142d0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
142e0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
142f0 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
14300 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
14310 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
14320 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
14330 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
14340 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
14350 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
14360 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
14370 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
14380 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
14390 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
143a0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
143b0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
143c0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
143d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
143e0 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
143f0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
14400 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
14410 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
14420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
14430 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
14440 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
14450 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
14460 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
14470 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
14480 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
14490 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
144a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
144b0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
144c0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
144d0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
144e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
144f0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
14500 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
14510 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
14520 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
14530 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14540 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
14550 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14560 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
14570 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
14580 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
14590 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
145a0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
145b0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
145c0 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
145d0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
145e0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
145f0 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
14600 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
14610 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14620 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
14630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14640 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14660 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
14670 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
14680 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
14690 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
146a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
146b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
146c0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
146d0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
146e0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
146f0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
14700 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
14710 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
14720 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
14730 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
14740 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
14750 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
14760 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
14770 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
14780 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14790 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
147a0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
147b0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
147c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
147d0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
147e0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
147f0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
14800 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
14810 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
14820 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
14830 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
14840 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
14850 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
14860 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
14870 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14890 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
148a0 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
148b0 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
148c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
148d0 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
148e0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
148f0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14910 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
14920 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
14930 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
14940 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
14950 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
14960 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
14970 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
14980 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
14990 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
149a0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
149b0 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
149c0 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
149d0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
149e0 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
149f0 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
14a00 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
14a10 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
14a20 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
14a30 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
14a40 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
14a50 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
14a60 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
14a70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
14a80 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
14a90 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
14aa0 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
14ab0 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
14ac0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
14ad0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
14ae0 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
14af0 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
14b00 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
14b10 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
14b20 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
14b30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
14b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14b50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
14b60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14b70 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
14b80 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
14b90 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
14ba0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
14bb0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14bc0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
14bd0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
14be0 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
14bf0 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
14c00 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
14c10 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
14c20 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
14c30 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
14c40 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
14c50 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
14c60 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
14c70 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
14c80 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
14c90 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
14ca0 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
14cb0 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
14cc0 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
14cd0 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
14ce0 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
14cf0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
14d00 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
14d10 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
14d20 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
14d30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14d40 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
14d50 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
14d60 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
14d70 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
14d80 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
14d90 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
14da0 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
14db0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
14dc0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
14dd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14de0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
14df0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
14e00 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
14e10 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
14e20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
14e30 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
14e40 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
14e50 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
14e60 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
14e70 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
14e80 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
14e90 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
14ea0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
14eb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14ec0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
14ed0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
14ee0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
14ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14f00 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
14f10 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
14f20 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
14f30 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
14f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14f50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14f60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
14f70 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
14f80 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65  ELETE flag if ne
14f90 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
14fa0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
14fb0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
14fc0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
14fd0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
14fe0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53  value of the BTS
14ff0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a  _SECURE_DELETE.*
15000 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20  * setting after 
15010 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69  the change..*/.i
15020 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15030 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
15040 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
15050 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
15060 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
15070 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
15080 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
15090 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
150a0 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
150b0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43  lags &= ~BTS_SEC
150c0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  URE_DELETE;.    
150d0 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d  if( newFlag ) p-
150e0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
150f0 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
15100 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  ETE;.  } .  b = 
15110 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
15120 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
15130 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c  ELETE)!=0;.  sql
15140 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15150 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
15160 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
15170 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
15180 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
15190 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
151a0 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
151b0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
151c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
151d0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
151e0 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
151f0 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
15200 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
15210 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
15220 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
15230 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
15240 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
15250 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
15260 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
15270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15280 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
15290 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
152a0 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
152b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
152c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
152d0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
152e0 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
152f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15300 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
15310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
15320 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
15330 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
15340 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
15350 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
15360 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
15370 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
15380 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
15390 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
153a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
153b0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
153c0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
153d0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
153e0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
153f0 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
15400 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
15410 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15420 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
15430 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15440 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
15450 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
15460 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
15470 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
15480 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
15490 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
154a0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
154b0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
154c0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
154d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
154e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
154f0 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
15500 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
15510 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
15520 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15530 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
15540 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
15550 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
15560 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
15570 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
15580 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
15590 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
155a0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
155b0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
155c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
155d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
155e0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
155f0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
15600 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
15610 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15620 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
15630 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
15640 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
15650 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
15660 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15670 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
15680 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
15690 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
156a0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
156b0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
156c0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
156d0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
156e0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
156f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
15700 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
15710 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
15720 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
15730 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
15740 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
15750 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
15760 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
15770 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
15780 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
15790 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
157a0 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
157b0 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
157c0 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
157d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
157e0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
157f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15800 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
15810 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
15820 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
15830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15840 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
15850 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
15860 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
15870 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15880 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
15890 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
158a0 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
158b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
158c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
158d0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
158e0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
158f0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
15900 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
15910 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
15920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15930 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
15940 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
15950 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
15960 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
15970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15980 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
15990 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
159a0 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
159b0 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
159c0 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
159d0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
159e0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
159f0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
15a00 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
15a10 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
15a20 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
15a30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
15a40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
15a50 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
15a60 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
15a70 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
15a80 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
15a90 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
15aa0 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
15ab0 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
15ac0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
15ad0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
15ae0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
15af0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
15b00 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
15b10 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
15b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
15b30 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
15b40 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
15b50 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
15b60 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
15b70 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
15b80 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
15b90 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
15ba0 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
15bb0 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
15bc0 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
15bd0 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
15be0 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
15bf0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
15c00 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
15c10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
15c20 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
15c30 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
15c40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
15c50 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
15c60 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
15c70 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15c80 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
15c90 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
15ca0 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
15cb0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
15cc0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
15cd0 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
15ce0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
15cf0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15d00 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
15d10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15d20 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
15d30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15d40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15d50 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
15d60 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
15d70 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
15d80 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
15d90 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
15da0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
15db0 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
15dc0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
15dd0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
15de0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
15df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
15e00 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
15e10 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
15e20 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
15e30 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
15e40 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
15e50 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
15e60 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
15e70 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
15e80 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
15e90 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
15ea0 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
15eb0 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
15ec0 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
15ed0 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
15ee0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
15ef0 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
15f00 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
15f10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15f20 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
15f30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15f40 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
15f50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
15f60 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
15f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15f80 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
15f90 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
15fa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15fc0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15fd0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
15fe0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d  else if( isOpen=
15ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
16000 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16010 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
16020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
16030 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
16040 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
16050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16060 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
16070 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54   R-15465-20813 T
16080 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d  he maximum and m
16090 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  inimum embedded 
160a0 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66  payload.    ** f
160b0 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  ractions and the
160c0 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72   leaf payload fr
160d0 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75  action values mu
160e0 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e  st be 64, 32, an
160f0 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  d 32..    **.   
16100 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
16110 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
16120 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
16130 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
16140 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
16150 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
16160 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
16170 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
16180 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
16190 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
161a0 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
161b0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
161c0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
161d0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
161e0 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
161f0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
16200 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
16210 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
16220 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
16230 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
16240 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
16250 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
16260 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
16270 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
16280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16290 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a  . */.    pageSiz
162a0 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
162b0 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
162c0 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  <16);.    /* EVI
162d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30  DENCE-OF: R-2500
162e0 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65  8-21688 The size
162f0 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20   of a page is a 
16300 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20  power of two.   
16310 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20   ** between 512 
16320 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73  and 65536 inclus
16330 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ive. */.    if( 
16340 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
16350 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
16360 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
16370 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
16380 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
16390 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
163a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
163b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
163c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
163d0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
163e0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
163f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
16400 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
16410 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
16420 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
16430 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
16440 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
16450 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16460 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
16470 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
16480 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
16490 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
164a0 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
164b0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
164c0 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
164d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
164e0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
164f0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
16500 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
16510 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
16520 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
16530 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
16540 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
16550 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
16560 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
16570 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
16580 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
16590 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
165a0 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
165b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
165c0 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
165d0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
165e0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
165f0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
16600 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
16610 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
16620 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
16630 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
16640 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
16650 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
16660 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
16670 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
16680 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
16690 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
166a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
166b0 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
166c0 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
166d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
166e0 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
166f0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
16700 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16710 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
16720 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
16730 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
16740 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
16750 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
16760 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
16770 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16780 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
16790 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
167a0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
167b0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
167c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
167f0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
16800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16810 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
16820 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
16830 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
16840 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
16850 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
16860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
16870 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
16880 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16890 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
168a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
168b0 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34  F: R-28312-64704
168c0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73   However, the us
168d0 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  able size is not
168e0 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20   allowed to.    
168f0 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ** be less than 
16900 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  480. In other wo
16910 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65  rds, if the page
16920 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68   size is 512, th
16930 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
16940 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a  served space siz
16950 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
16960 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75  32. */.    if( u
16970 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
16980 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16990 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
169a0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
169b0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
169c0 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
169d0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
169e0 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
169f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16a00 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
16a10 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
16a20 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
16a30 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
16a40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
16a50 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
16a60 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
16a70 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
16a80 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
16a90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
16aa0 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
16ab0 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
16ac0 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
16ad0 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
16ae0 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
16af0 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
16b00 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
16b10 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
16b20 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
16b30 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
16b40 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
16b50 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
16b60 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
16b70 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
16b80 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
16b90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
16ba0 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
16bb0 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
16bc0 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
16bd0 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
16be0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
16bf0 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
16c00 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
16c10 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
16c20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
16c30 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
16c40 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
16c50 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
16c60 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
16c70 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
16c80 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
16c90 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
16ca0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
16cb0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
16cc0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
16cd0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
16ce0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
16cf0 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
16d00 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
16d10 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
16d20 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
16d30 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
16d40 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
16d50 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
16d60 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
16d70 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
16d80 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
16d90 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
16da0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
16db0 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
16dc0 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
16dd0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
16de0 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
16df0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
16e00 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
16e10 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
16e20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
16e30 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
16e40 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
16e50 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
16e60 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
16e70 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
16e80 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
16e90 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
16ea0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
16eb0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16ec0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
16ed0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16ee0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
16ef0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
16f00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16f10 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
16f20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
16f30 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
16f40 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
16f50 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
16f60 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
16f70 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
16f80 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
16f90 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
16fa0 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
16fb0 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
16fc0 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
16fd0 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
16fe0 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
16ff0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
17000 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
17010 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
17020 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
17030 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
17040 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
17050 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
17060 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
17070 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
17080 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
17090 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
170a0 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
170b0 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
170c0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
170d0 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
170e0 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
170f0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
17100 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
17110 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
17120 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
17130 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
17140 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
17150 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
17160 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
17170 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
17180 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
17190 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
171a0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
171b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
171c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
171d0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
171e0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
171f0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
17200 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
17210 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
17220 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
17230 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
17240 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
17250 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
17260 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
17270 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
17280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
17290 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
172a0 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
172b0 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
172c0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
172d0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
172e0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
172f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17300 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
17310 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
17320 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
17330 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
17340 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17350 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17360 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17370 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
17380 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
17390 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
173a0 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
173b0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
173c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
173d0 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
173e0 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
173f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
17400 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
17410 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17420 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
17430 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
17440 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
17450 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
17460 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
17470 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
17480 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
17490 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
174a0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
174b0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
174c0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
174d0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
174e0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
174f0 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
17500 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
17510 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
17520 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
17530 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
17540 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
17550 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
17560 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17570 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
17580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
17590 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
175a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
175b0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
175c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
175d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
175e0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
175f0 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
17600 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
17610 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
17620 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17630 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
17640 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
17650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
17660 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
17670 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
17680 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
17690 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
176a0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
176b0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
176c0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
176d0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
176e0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
176f0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
17700 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
17710 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
17720 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
17730 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
17740 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
17750 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
17760 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
17770 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
17780 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
17790 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
177a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
177b0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
177c0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
177d0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
177e0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
177f0 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
17800 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
17810 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
17820 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
17830 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
17840 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17850 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
17860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17870 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17880 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
17890 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
178a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
178b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
178c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
178d0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
178e0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
178f0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
17900 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
17910 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
17920 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
17930 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
17940 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
17950 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
17960 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
17970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17980 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
17990 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
179a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
179b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
179c0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
179d0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
179e0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
179f0 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
17a00 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
17a10 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
17a20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
17a30 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
17a40 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
17a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17a60 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
17a70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
17a80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17a90 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
17aa0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
17ab0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
17ac0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
17ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17ae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17af0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
17b00 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
17b10 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
17b20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
17b30 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
17b40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17b50 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
17b60 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
17b70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
17b80 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
17b90 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
17ba0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
17bb0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
17bc0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
17bd0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
17be0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
17bf0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
17c00 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
17c10 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
17c20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
17c30 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
17c40 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
17c50 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
17c60 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
17c70 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
17c80 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
17c90 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
17ca0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
17cb0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
17cc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
17cd0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
17ce0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
17cf0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
17d00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17d10 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
17d20 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
17d30 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
17d40 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
17d50 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
17d60 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
17d70 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
17d80 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
17d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
17da0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
17db0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
17dc0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
17dd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17de0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
17df0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17e00 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
17e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
17e20 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
17e30 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
17e40 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
17e50 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
17e60 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
17e70 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
17e80 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
17e90 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
17ea0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
17eb0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
17ec0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
17ed0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
17ee0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
17ef0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
17f00 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
17f10 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
17f20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
17f30 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
17f40 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
17f50 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
17f60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
17f70 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
17f80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
17f90 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
17fa0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
17fb0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
17fc0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
17fd0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
17fe0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
17ff0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
18000 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
18010 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
18020 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
18030 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
18040 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
18050 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
18060 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
18070 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
18080 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
18090 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
180a0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
180b0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
180c0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
180d0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
180e0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
180f0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
18100 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
18110 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
18120 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
18130 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
18140 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
18150 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
18160 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
18170 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
18180 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
18190 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
181a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
181b0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
181c0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
181d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
181e0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
181f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18200 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18210 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
18220 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
18230 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
18240 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
18250 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
18260 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
18270 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
18280 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
18290 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
182a0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
182b0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
182c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
182d0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
182e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
182f0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
18300 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
18310 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
18320 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
18330 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18340 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18350 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
18360 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
18370 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
18380 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
18390 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
183a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
183b0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
183c0 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
183d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
183e0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
183f0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
18400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
18410 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
18420 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
18430 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18440 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18450 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
18460 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
18470 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
18480 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
18490 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
184a0 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
184b0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
184c0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
184d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
184e0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
184f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
18500 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
18510 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
18520 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
18530 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
18540 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
18550 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
18560 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
18570 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
18580 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
18590 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
185a0 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
185b0 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
185c0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
185d0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
185e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
185f0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
18600 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
18610 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
18620 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
18630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18640 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
18650 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
18660 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
18670 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
18680 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
18690 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
186a0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
186b0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
186c0 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
186d0 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
186e0 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
186f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
18700 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
18710 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
18720 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
18730 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
18740 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
18750 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
18760 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
18770 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18780 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
18790 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
187a0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
187b0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
187c0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
187d0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
187e0 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
187f0 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
18800 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
18810 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
18820 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
18830 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
18840 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
18850 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
18860 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
18870 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
18880 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
18890 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
188a0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
188b0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
188c0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
188d0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
188e0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
188f0 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
18900 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
18910 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
18920 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
18930 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
18940 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
18950 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
18960 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
18970 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
18980 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
18990 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
189a0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
189b0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
189c0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
189d0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
189e0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
189f0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
18a00 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
18a10 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
18a20 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
18a30 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
18a40 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
18a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
18a60 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
18a70 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
18a80 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
18a90 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
18aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
18ab0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
18ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
18ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
18ae0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
18af0 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
18b00 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
18b10 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
18b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18b30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
18b40 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
18b50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18b60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
18b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
18b90 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
18ba0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
18bb0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
18bc0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
18bd0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18be0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
18bf0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
18c00 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
18c10 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
18c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18c30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
18c40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
18c50 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
18c60 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
18c70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18c80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
18c90 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
18ca0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
18cb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
18cc0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
18cd0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
18ce0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
18cf0 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
18d00 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
18d10 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
18d20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
18d30 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
18d40 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
18d50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
18d60 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
18d70 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
18d80 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
18d90 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
18da0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
18db0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
18dc0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18dd0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
18de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18df0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
18e00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
18e10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
18e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18e30 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
18e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
18e50 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
18e60 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
18e70 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
18e80 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
18e90 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
18ea0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
18eb0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18ec0 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
18ed0 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
18ee0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
18ef0 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
18f00 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
18f10 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
18f20 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
18f30 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
18f40 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
18f50 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
18f60 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
18f70 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
18f80 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
18f90 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
18fa0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
18fb0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
18fc0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
18fd0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
18fe0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
18ff0 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
19000 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
19010 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
19020 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
19030 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
19040 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
19050 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
19060 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
19070 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
19080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19090 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
190a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
190b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
190c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
190d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
190e0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
190f0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
19100 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19110 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
19120 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
19130 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
19140 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
19150 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
19160 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
19170 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
19180 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
19190 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
191a0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
191b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
191c0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
191d0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
191e0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
191f0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
19200 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
19210 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
19220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19230 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
19240 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19250 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
19260 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
19270 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
19280 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19290 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
192a0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
192b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
192c0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
192d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
192e0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
192f0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
19300 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
19310 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
19320 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
19330 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
19340 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
19350 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
19360 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
19370 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
19380 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
19390 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
193a0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
193b0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
193e0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
193f0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19420 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
19430 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
19440 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19460 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19470 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19480 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
19490 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
194a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
194b0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
194c0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
194d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
194e0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
194f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19500 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
19510 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
19520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19530 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
19540 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
19550 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
19560 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
19570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
19580 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
19590 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
195a0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
195b0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
195c0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
195d0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
195e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
195f0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
19600 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
19610 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
19620 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
19630 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
19640 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
19650 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19660 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
19670 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
19680 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
19690 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
196a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
196b0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
196c0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
196d0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
196e0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
196f0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
19700 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
19710 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
19720 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
19730 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
19740 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
19750 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
19760 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
19770 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
19780 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
19790 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
197a0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
197b0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
197c0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
197d0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
197e0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
197f0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
19800 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
19810 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
19820 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
19830 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
19860 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
19870 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
19880 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
19890 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
198a0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
198b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
198c0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
198d0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
198e0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
198f0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
19900 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
19910 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
19920 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
19930 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
19940 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
19950 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
19960 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
19970 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
19980 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
19990 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
199a0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
199b0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
199c0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
199d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
199e0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
199f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
19a00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
19a10 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
19a20 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
19a30 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
19a40 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
19a50 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
19a60 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
19a70 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
19a80 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
19a90 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
19aa0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
19ab0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
19ac0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
19ad0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19ae0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
19af0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
19b00 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
19b10 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
19b20 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
19b30 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
19b40 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
19b50 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
19b60 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
19b70 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
19b80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
19b90 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
19ba0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
19bb0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
19bc0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
19bd0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
19be0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
19bf0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
19c00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
19c10 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
19c20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
19c30 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
19c40 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
19c50 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
19c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
19c70 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
19c80 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
19c90 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
19ca0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
19cb0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
19cc0 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
19cd0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
19ce0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
19cf0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
19d00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19d10 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
19d20 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
19d30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
19d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
19d60 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
19d70 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
19d80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
19d90 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
19da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19dc0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
19dd0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
19de0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
19df0 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
19e00 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
19e10 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
19e20 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
19e30 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
19e40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19e50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19e70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
19e80 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
19e90 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
19ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
19eb0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
19ec0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
19ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19ee0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
19ef0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
19f00 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
19f10 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
19f20 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
19f30 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
19f40 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
19f50 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
19f60 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
19f70 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
19f80 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
19f90 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
19fa0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
19fb0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
19fc0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
19fd0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
19fe0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
19ff0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
1a000 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
1a010 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
1a020 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
1a030 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
1a040 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a050 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
1a060 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
1a080 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
1a090 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
1a0a0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
1a0b0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
1a0c0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1a0d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1a0e0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
1a0f0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1a100 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
1a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1a120 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
1a130 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
1a140 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1a150 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
1a160 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
1a170 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
1a180 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
1a190 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1a1a0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
1a1b0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
1a1c0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1a1d0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
1a1e0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
1a1f0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
1a200 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1a210 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
1a220 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
1a230 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
1a240 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
1a250 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1a260 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1a270 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
1a280 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
1a290 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1a2a0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
1a2b0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
1a2c0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1a2d0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1a2e0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
1a2f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a300 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a310 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
1a320 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
1a330 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1a340 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1a350 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1a360 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1a370 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1a380 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1a390 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1a3a0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1a3b0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1a3c0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1a3d0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1a3e0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1a3f0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1a400 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1a410 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1a420 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1a430 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1a440 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1a460 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1a470 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1a480 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1a490 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1a4a0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1a4b0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1a4c0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1a4d0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1a4e0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1a4f0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1a500 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1a510 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1a520 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1a530 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1a540 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1a550 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1a560 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1a570 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1a580 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1a590 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1a5a0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1a5b0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1a5c0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1a5d0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1a5e0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1a5f0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1a600 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1a610 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1a620 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1a630 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1a640 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1a650 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1a660 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1a670 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1a680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a690 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a6a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1a6b0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1a6c0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1a6d0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1a6e0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1a6f0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1a700 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1a710 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1a720 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1a730 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1a740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1a760 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a780 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1a790 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1a7a0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1a7b0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1a7c0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1a7d0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1a7e0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1a7f0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1a800 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1a810 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1a820 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1a830 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1a840 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1a850 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1a860 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1a870 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a8a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1a8b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1a8c0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1a8d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a8f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1a900 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1a910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a920 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1a930 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1a940 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1a950 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1a960 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a970 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1a980 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a990 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1a9a0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
1a9b0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
1a9c0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
1a9d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a9e0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1a9f0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
1aa00 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
1aa10 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
1aa20 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1aa30 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
1aa40 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
1aa50 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
1aa60 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
1aa70 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
1aa80 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
1aa90 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
1aaa0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1aab0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
1aac0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
1aad0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
1aae0 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
1aaf0 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
1ab00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1ab10 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
1ab20 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
1ab30 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
1ab40 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
1ab50 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1ab60 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
1ab70 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
1ab80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
1ab90 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
1aba0 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
1abb0 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
1abc0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
1abd0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
1abe0 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
1abf0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
1ac00 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
1ac10 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1ac20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1ac30 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
1ac40 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
1ac50 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1ac60 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
1ac70 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1ac80 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
1ac90 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
1aca0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1acb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1acc0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
1acd0 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
1ace0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
1acf0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
1ad00 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1ad10 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
1ad20 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
1ad30 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
1ad40 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
1ad50 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
1ad60 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
1ad70 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
1ad80 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1ad90 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
1ada0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1adb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1adc0 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
1add0 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
1ade0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
1adf0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
1ae00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1ae10 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
1ae20 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
1ae30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ae40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ae50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ae60 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1ae70 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
1ae80 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
1ae90 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1aea0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
1aeb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1aec0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
1aed0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
1aee0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
1aef0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
1af00 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1af10 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1af20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
1af30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1af40 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
1af50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1af60 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1af70 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
1af80 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
1af90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1afa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1afb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1afc0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1afd0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1afe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1aff0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b000 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1b010 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1b020 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1b030 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1b040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
1b050 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
1b060 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
1b070 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
1b080 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
1b090 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
1b0a0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
1b0b0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
1b0c0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
1b0d0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
1b0e0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1b0f0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1b100 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
1b110 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
1b120 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
1b130 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
1b140 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
1b150 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
1b160 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1b170 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
1b180 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1b190 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1b1a0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1b1b0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1b1c0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
1b1d0 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
1b1e0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
1b1f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b200 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1b210 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1b220 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b230 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
1b240 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
1b250 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1b260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b270 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
1b280 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
1b290 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1b2a0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
1b2b0 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
1b2c0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
1b2d0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
1b2e0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
1b2f0 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
1b300 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
1b310 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1b320 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
1b330 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
1b340 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
1b350 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
1b360 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1b370 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
1b380 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1b390 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1b3a0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
1b3b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b3d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b3e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1b3f0 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
1b400 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
1b410 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
1b420 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
1b430 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
1b440 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
1b450 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
1b460 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
1b470 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
1b480 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
1b490 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
1b4a0 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
1b4b0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1b4c0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
1b4d0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
1b4e0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
1b4f0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
1b500 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
1b510 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
1b520 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
1b530 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
1b540 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1b550 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
1b560 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
1b570 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
1b580 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
1b590 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1b5a0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1b5b0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1b5c0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1b5d0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1b5e0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
1b5f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b610 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1b620 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1b630 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b640 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b650 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b660 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1b670 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
1b680 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
1b690 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
1b6a0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
1b6b0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
1b6c0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
1b6d0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
1b6e0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
1b6f0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
1b700 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
1b710 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1b720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b740 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b760 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
1b770 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
1b780 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
1b790 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
1b7a0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
1b7b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
1b7c0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1b7d0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
1b7e0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1b7f0 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
1b800 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
1b810 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
1b820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b830 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
1b840 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
1b850 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1b860 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1b870 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
1b880 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
1b890 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
1b8a0 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
1b8b0 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
1b8c0 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
1b8d0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1b8e0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
1b8f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
1b900 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
1b910 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
1b920 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
1b930 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
1b940 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
1b950 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b970 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1b980 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
1b990 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
1b9a0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
1b9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b9c0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
1b9d0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
1b9e0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1ba10 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
1ba20 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
1ba30 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
1ba40 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
1ba50 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
1ba60 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
1ba70 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
1ba80 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
1ba90 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
1baa0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
1bab0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
1bac0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
1bad0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1bae0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1baf0 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
1bb00 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
1bb10 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
1bb20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1bb30 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1bb40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1bb50 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
1bb60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1bb70 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
1bb80 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1bb90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1bba0 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
1bbb0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
1bbc0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
1bbd0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1bbe0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
1bbf0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1bc00 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
1bc10 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1bc20 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
1bc30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
1bc40 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
1bc50 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
1bc60 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1bc70 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
1bc80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1bc90 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
1bca0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1bcb0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1bcc0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
1bcd0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1bce0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1bcf0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1bd00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1bd10 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1bd20 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1bd30 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1bd40 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
1bd50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1bd60 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
1bd70 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1bd80 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1bd90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1bda0 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
1bdb0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1bdc0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
1bdd0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1bde0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1bdf0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
1be00 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1be10 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1be20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
1be30 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
1be40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1be50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
1be60 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
1be70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1be80 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1be90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1bea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1beb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
1bec0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1bed0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
1bee0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1bef0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1bf00 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
1bf10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1bf20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1bf40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1bf50 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1bf60 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1bf70 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1bf80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1bf90 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1bfa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1bfb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1bfc0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1bfd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1bfe0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1bff0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c000 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c010 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
1c020 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1c030 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
1c040 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
1c050 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
1c060 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1c070 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
1c080 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c090 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
1c0a0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
1c0b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c0c0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1c0d0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1c0e0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
1c0f0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
1c100 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
1c110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1c120 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
1c130 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
1c140 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
1c150 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
1c160 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
1c170 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
1c180 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
1c190 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
1c1a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1c1b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c1c0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
1c1d0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
1c1e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1c1f0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1c200 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
1c210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c220 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1c230 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1c240 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1c250 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
1c260 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1c270 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
1c280 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1c290 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
1c2a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1c2b0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
1c2c0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
1c2d0 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
1c2e0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
1c2f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1c300 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
1c310 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
1c320 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
1c330 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
1c340 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
1c350 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
1c360 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
1c370 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
1c380 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
1c390 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
1c3a0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1c3b0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
1c3c0 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
1c3d0 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
1c3e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1c3f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
1c400 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1c410 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
1c420 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
1c430 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1c440 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1c450 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1c460 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1c470 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1c480 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1c490 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1c4a0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1c4b0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1c4c0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1c4d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c4e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1c4f0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1c500 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1c510 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1c520 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1c530 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1c540 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1c550 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1c560 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c570 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1c580 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1c590 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1c5a0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1c5b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1c5c0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1c5d0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1c5e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1c5f0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1c600 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1c610 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1c620 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1c630 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1c640 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1c650 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1c660 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c670 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c680 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1c690 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1c6a0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1c6b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1c6c0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1c6d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c6e0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1c6f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1c700 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c710 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1c720 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1c730 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1c740 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1c750 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1c760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c770 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c780 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1c790 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1c7a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1c7b0 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1c7c0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1c7d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c7e0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1c7f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1c800 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1c810 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1c820 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1c830 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1c840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1c850 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1c860 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1c870 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1c880 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1c890 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1c8a0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1c8b0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1c8c0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1c8d0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1c8e0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1c8f0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1c900 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1c910 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1c920 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1c930 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1c940 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1c950 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1c960 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1c970 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1c980 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1c990 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1c9a0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1c9b0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1c9c0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1c9d0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1c9e0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1c9f0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1ca00 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1ca10 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1ca20 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1ca30 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1ca40 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1ca50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ca60 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1ca70 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1ca80 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1ca90 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1caa0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1cab0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1cac0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1cad0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1cae0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1caf0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1cb00 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1cb10 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1cb20 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1cb30 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1cb40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1cb50 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1cb60 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1cb70 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1cb80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb90 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1cba0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1cbb0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1cbc0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1cbd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1cbe0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1cbf0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1cc00 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1cc10 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1cc20 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1cc30 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1cc40 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1cc50 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1cc60 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1cc70 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1cc80 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1cc90 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1cca0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1ccb0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1ccc0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1ccd0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1cce0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1ccf0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1cd00 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1cd10 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1cd20 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1cd30 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1cd40 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1cd50 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1cd60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1cd70 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1cd80 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1cd90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1cda0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1cdb0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1cdc0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1cdd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cde0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1cdf0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ce00 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1ce10 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ce20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ce30 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1ce40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ce50 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1ce60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ce70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1ce80 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1ce90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1cea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ceb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1cec0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1ced0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cef0 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1cf00 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1cf10 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1cf20 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1cf30 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1cf40 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1cf50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cf60 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1cf70 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1cf80 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1cf90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1cfa0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1cfb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cfc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cfd0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1cfe0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1cff0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1d000 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1d010 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1d020 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1d030 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1d040 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1d050 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1d060 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1d070 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1d080 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1d090 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1d0a0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1d0b0 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1d0c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d0d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1d0e0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1d0f0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1d100 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1d110 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1d120 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1d130 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1d140 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1d150 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1d160 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1d170 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1d180 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1d190 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1d1a0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1d1b0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1d1c0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1d1d0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1d1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d1f0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1d200 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1d210 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1d220 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1d230 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1d240 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1d250 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1d260 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1d270 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1d280 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1d290 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1d2a0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1d2b0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1d2c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1d2d0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1d2e0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1d2f0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1d300 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1d310 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1d320 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1d330 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1d340 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1d350 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1d360 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1d370 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1d380 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1d390 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1d3a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1d3b0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1d3c0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1d3d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1d3e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1d3f0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1d400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d410 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1d420 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d430 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1d440 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1d450 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1d460 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1d470 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1d480 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1d490 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1d4a0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1d4b0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1d4c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1d4d0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1d4e0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1d4f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1d500 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1d510 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1d520 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1d530 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1d540 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1d550 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1d560 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1d570 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1d580 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1d590 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1d5a0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1d5b0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1d5c0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1d5d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1d5e0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1d5f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1d600 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1d610 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1d620 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1d630 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1d640 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1d650 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1d660 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1d670 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1d680 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1d690 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1d6a0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1d6b0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1d6c0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1d6d0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1d6e0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1d6f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1d700 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1d710 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1d720 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1d730 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1d740 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1d750 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1d760 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1d770 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1d780 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1d790 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1d7a0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1d7b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1d7c0 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1d7d0 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1d7e0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1d7f0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1d800 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1d810 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1d820 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1d830 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1d840 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1d850 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1d860 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1d870 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1d880 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1d890 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d8a0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1d8b0 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1d8c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1d8d0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1d8e0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1d8f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1d900 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1d910 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1d920 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1d930 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1d940 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1d950 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1d960 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1d970 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1d980 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1d990 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1d9a0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1d9b0 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1d9c0 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1d9d0 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1d9e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1d9f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1da00 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1da10 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1da20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1da30 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1da40 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1da50 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1da60 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1da70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1da80 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1da90 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1daa0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1dab0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1dac0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1dad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1daf0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1db00 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1db10 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1db20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1db30 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1db40 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1db50 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1db60 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1db70 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1db80 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1db90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1dba0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1dbb0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1dbc0 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1dbd0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1dbe0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1dbf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1dc00 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1dc10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1dc20 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1dc30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dc40 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1dc50 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1dc60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1dc70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1dc80 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1dc90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1dca0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1dcb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1dcc0 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
1dcd0 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
1dce0 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
1dcf0 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
1dd00 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
1dd10 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1dd20 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1dd30 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1dd40 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1dd50 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1dd60 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1dd70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1dd80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1dda0 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1ddb0 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1ddc0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ddd0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1dde0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ddf0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1de00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1de10 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1de20 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1de30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1de50 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1de60 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1de70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1de80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1de90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1dea0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1deb0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1dec0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1ded0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1dee0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1def0 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
1df00 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1df10 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1df20 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
1df30 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
1df40 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
1df50 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
1df60 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
1df70 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
1df80 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
1df90 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
1dfa0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
1dfb0 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
1dfc0 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
1dfd0 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
1dfe0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
1dff0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1e000 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
1e010 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
1e020 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
1e030 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e040 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
1e050 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
1e060 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
1e070 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
1e080 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
1e090 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
1e0a0 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
1e0b0 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
1e0c0 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
1e0d0 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
1e0e0 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
1e0f0 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
1e100 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
1e110 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
1e120 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
1e130 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
1e140 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
1e150 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
1e160 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1e170 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
1e180 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
1e190 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
1e1a0 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
1e1b0 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
1e1c0 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
1e1d0 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
1e1e0 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
1e1f0 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e200 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
1e210 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
1e220 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
1e230 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
1e240 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1e250 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
1e260 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
1e270 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1e280 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
1e290 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1e2a0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
1e2b0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
1e2c0 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
1e2d0 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
1e2e0 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
1e2f0 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
1e300 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e310 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
1e320 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
1e330 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
1e340 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
1e350 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
1e360 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e370 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1e380 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1e390 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1e3a0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
1e3b0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
1e3c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1e3d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e3e0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1e3f0 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
1e400 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
1e410 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
1e420 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
1e430 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
1e440 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1e450 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
1e460 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
1e470 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1e480 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1e490 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72   i;.      if( wr
1e4a0 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
1e4b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
1e4c0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
1e4d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
1e4e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e4f0 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
1e500 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
1e510 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
1e520 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
1e530 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
1e540 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e560 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
1e570 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1e580 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
1e590 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
1e5a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e5c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e5d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1e5e0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1e5f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
1e600 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1e610 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
1e620 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
1e630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e640 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1e650 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1e660 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e670 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1e680 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65         p->apPage
1e690 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
1e6a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e6b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1e6c0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
1e6d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e6e0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
1e6f0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1e700 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ress..**.** If t
1e710 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
1e720 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75  QLITE_OK then cu
1e730 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
1e740 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70  validated (tripp
1e750 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ed)..** Only wri
1e760 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74  te cursors are t
1e770 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
1e780 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20  nly is true but 
1e790 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a  all cursors are.
1e7a0 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72  ** tripped if wr
1e7b0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
1e7c0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1e7d0 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70  o use.** a tripp
1e7e0 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72  ed cursor will r
1e7f0 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
1e800 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
1e810 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1e820 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1e830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1e840 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1e850 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1e860 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1e870 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1e880 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1e890 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
1e8a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72  Btree *p, int tr
1e8b0 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  ipCode, int writ
1e8c0 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  eOnly){.  int rc
1e8d0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1e8e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
1e8f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
1e900 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f    assert( writeO
1e910 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f  nly==1 || writeO
1e920 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
1e930 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  rt( tripCode==SQ
1e940 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
1e950 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d  ACK || tripCode=
1e960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1e970 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e980 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
1e990 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
1e9a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
1e9b0 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
1e9c0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1e9d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77  ;.    if( rc ) w
1e9e0 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  riteOnly = 0;.  
1e9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1ea00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ea10 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
1ea20 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73  .    int rc2 = s
1ea30 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1ea40 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
1ea50 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79  pCode, writeOnly
1ea60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
1ea70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1ea80 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26  (writeOnly==0 &&
1ea90 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   rc2==SQLITE_OK)
1eaa0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21   );.    if( rc2!
1eab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
1eac0 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72  = rc2;.  }.  btr
1ead0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1eae0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1eaf0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1eb00 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1eb10 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1eb20 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1eb30 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1eb40 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1eb50 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1eb60 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1eb70 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1eb80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1eb90 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1eba0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1ebb0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1ebc0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1ebd0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1ebe0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1ebf0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1ec00 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1ec10 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1ec20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1ec30 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1ec40 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1ec50 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1ec60 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1ec70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec80 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1ec90 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1eca0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1ecb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1ecc0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1ecd0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1ece0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1ecf0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1ed00 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1ed10 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1ed20 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1ed30 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1ed40 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1ed50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ed60 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1ed70 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1ed80 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
1ed90 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1eda0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1edb0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
1edc0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
1edd0 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
1ede0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1edf0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1ee00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ee10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ee20 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1ee30 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1ee40 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1ee50 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1ee60 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1ee70 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1ee80 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1ee90 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1eea0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1eeb0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1eec0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1eed0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1eee0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1eef0 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1ef00 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1ef10 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1ef20 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1ef30 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1ef40 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1ef50 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1ef60 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1ef70 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1ef80 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1ef90 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1efa0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1efb0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1efc0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1efd0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1efe0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1eff0 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1f000 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1f010 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1f020 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1f030 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1f040 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1f050 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1f060 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1f070 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1f080 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1f090 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1f0a0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1f0b0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1f0c0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1f0d0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1f0e0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1f0f0 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1f100 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1f110 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1f120 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1f130 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1f140 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1f150 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1f160 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1f170 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1f180 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1f190 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1f1a0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1f1b0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1f1c0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1f1d0 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1f1e0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1f1f0 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1f200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f210 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1f220 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1f230 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1f240 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1f250 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1f260 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f270 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1f280 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1f290 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1f2a0 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
1f2b0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1f2c0 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
1f2d0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1f2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1f2f0 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1f300 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1f310 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1f320 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1f330 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1f340 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1f350 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1f360 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1f370 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1f380 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1f390 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1f3a0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1f3b0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1f3c0 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1f3d0 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1f3e0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1f3f0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1f400 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1f410 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1f420 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1f430 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1f440 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1f450 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1f460 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1f470 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1f480 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1f490 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1f4a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1f4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f4c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1f4d0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1f4e0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1f4f0 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1f500 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1f510 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1f520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1f530 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1f540 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1f550 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1f560 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1f570 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1f580 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1f590 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1f5a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1f5b0 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1f5c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1f5d0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1f5e0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1f5f0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1f600 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1f610 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1f620 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1f630 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1f640 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1f650 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1f660 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1f670 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1f680 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1f690 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1f6a0 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1f6b0 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1f6c0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1f6d0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1f6e0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1f6f0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1f700 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1f710 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1f720 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1f730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f740 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1f750 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1f760 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1f770 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f780 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1f790 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1f7a0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1f7b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1f7c0 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1f7d0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1f7e0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1f7f0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1f800 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1f810 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f820 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1f830 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1f840 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1f850 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1f860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f880 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1f890 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1f8a0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
1f8b0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
1f8c0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
1f8d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1f8e0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1f8f0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1f900 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f910 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1f920 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f930 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1f940 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1f950 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1f960 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1f970 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1f980 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1f990 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1f9a0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1f9b0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1f9c0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1f9d0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1f9e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1f9f0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1fa00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1fa10 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1fa20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fa30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1fa40 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1fa50 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1fa60 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1fa70 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1fa80 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1fa90 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1faa0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1fab0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1fac0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1fad0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1fae0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1faf0 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1fb00 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1fb10 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1fb20 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1fb30 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1fb40 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1fb50 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1fb60 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1fb70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1fb80 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1fb90 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1fba0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1fbb0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1fbc0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1fbd0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1fbe0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1fbf0 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1fc00 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1fc10 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1fc20 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1fc30 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1fc40 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1fc50 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1fc60 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1fc70 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1fc80 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1fc90 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1fca0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1fcb0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1fcc0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1fcd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1fce0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1fcf0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1fd00 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1fd10 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1fd20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1fd30 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1fd40 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1fd50 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1fd60 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1fd70 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1fd80 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1fd90 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1fda0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1fdb0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1fdc0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1fdd0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1fde0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1fdf0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1fe00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1fe10 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1fe20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1fe30 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1fe40 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1fe50 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1fe60 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1fe70 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1fe80 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1fe90 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1fea0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1feb0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1fec0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1fed0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1fee0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1fef0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1ff00 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1ff10 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1ff20 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1ff30 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1ff40 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1ff50 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1ff60 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1ff70 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1ff80 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1ff90 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1ffa0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1ffb0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1ffc0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fff0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
20000 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
20030 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
20040 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
20050 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20070 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
20080 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
20090 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
200a0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
200b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
200c0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
200d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
200e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20100 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
20110 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
20120 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
20130 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20150 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
20160 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
20170 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
20180 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
20190 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
201a0 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
201b0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
201c0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
201d0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
201e0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
201f0 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
20200 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
20210 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
20220 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
20230 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
20240 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
20250 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
20260 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
20270 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
20280 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
20290 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
202a0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
202b0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
202c0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
202d0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
202e0 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
202f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
20300 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
20310 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
20320 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
20330 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
20340 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
20350 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
20360 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
20370 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
20380 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
20390 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
203a0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
203b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
203c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
203d0 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
203e0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
203f0 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
20400 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  g && (pBt->btsFl
20410 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
20420 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  NLY)!=0) ){.    
20430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
20440 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
20450 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
20460 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
20470 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
20480 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
20490 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
204a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
204b0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
204c0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
204d0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
204e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
204f0 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
20500 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
20510 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
20520 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
20530 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
20540 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
20550 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
20560 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
20570 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
20580 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
20590 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
205a0 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
205b0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
205c0 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
205d0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
205e0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
205f0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
20600 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74   = pBt;.  assert
20610 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
20620 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74  rFlag==BTCF_Writ
20630 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d  eFlag );.  pCur-
20640 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
20650 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
20660 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
20670 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
20680 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
20690 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
206a0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
206b0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
206c0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
206d0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
206e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
206f0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
20700 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
20710 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20740 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
20750 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20780 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
20790 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
207a0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
207d0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
207e0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
207f0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
20800 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
20810 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20820 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
20830 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
20840 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
20870 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
20880 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
20890 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
208a0 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
208b0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
208c0 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
208d0 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
208e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
208f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20900 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20910 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
20920 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
20930 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
20940 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
20950 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
20960 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
20970 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
20980 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
20990 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
209a0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
209b0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
209c0 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
209d0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
209e0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
209f0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
20a00 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
20a10 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
20a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20a30 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
20a40 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
20a50 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
20a60 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
20a70 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
20a80 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
20a90 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
20aa0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
20ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
20ac0 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
20ad0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
20ae0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
20af0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
20b00 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
20b10 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
20b20 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
20b30 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
20b40 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
20b50 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
20b60 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
20b70 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
20b80 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
20b90 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
20ba0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
20bb0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
20bc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20bd0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
20be0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
20bf0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
20c00 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
20c10 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
20c20 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
20c30 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
20c40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20c50 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
20c60 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
20c70 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
20c80 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
20c90 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
20ca0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
20cb0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
20cc0 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
20cd0 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
20ce0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
20cf0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
20d00 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
20d10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
20d20 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
20d30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20d40 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
20d50 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
20d60 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
20d70 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
20d80 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
20d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20da0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
20db0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
20dc0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
20dd0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
20de0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
20df0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
20e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20e10 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
20e20 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
20e30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
20e40 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
20e50 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
20e60 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
20e70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20e80 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
20e90 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
20ea0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
20eb0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
20ec0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20ed0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20ee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20ef0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
20f00 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
20f10 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
20f20 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
20f30 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
20f40 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
20f50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20f60 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
20f70 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
20f80 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
20f90 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
20fa0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
20fb0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
20fc0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
20fd0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
20fe0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
20ff0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21000 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
21010 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
21020 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
21030 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
21040 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
21050 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
21060 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
21070 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
21080 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
21090 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
210a0 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
210b0 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
210c0 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
210d0 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
210e0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
210f0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
21100 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
21110 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
21120 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
21130 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
21140 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
21150 67 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  ggressive inlini
21160 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
21170 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
21180 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
21190 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
211a0 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
211b0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
211c0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
211d0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
211e0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
211f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
21200 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
21210 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
21220 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
21230 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
21240 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
21250 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
21260 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
21270 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
21280 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
21290 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
212a0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
212b0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
212c0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
212d0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
212e0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
212f0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
21300 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
21310 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
21320 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
21330 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
21340 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
21350 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
21360 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
21370 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
21380 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
21390 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
213a0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
213b0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
213c0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
213d0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
213e0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
213f0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
21400 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
21410 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
21420 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
21430 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
21440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21450 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
21460 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
21470 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
21480 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
21490 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
214a0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
214b0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
214c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
214d0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
214e0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
21530 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
21540 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
21580 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
21590 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
215d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
215e0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
215f0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
21600 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
21610 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70  ;        \.    p
21620 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
21630 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
21670 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
216c0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
216d0 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21710 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
21720 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
21730 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
21740 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
21750 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
21760 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
21770 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
21780 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
21790 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
217a0 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
217b0 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
217c0 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
217d0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
217e0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
217f0 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
21800 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
21810 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
21820 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
21830 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
21840 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
21850 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
21860 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
21870 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
21880 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
21890 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
218a0 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
218b0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
218c0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
218d0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
218e0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
218f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
21900 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
21910 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
21920 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
21930 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
21940 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
21950 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
21960 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
21970 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
21980 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
21990 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
219a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
219b0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
219c0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
219d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
219e0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
219f0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
21a00 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
21a10 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
21a20 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
21a30 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
21a40 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
21a50 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
21a60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
21a70 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
21a80 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
21a90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
21aa0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
21ab0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21ac0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21ad0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21ae0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21af0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
21b00 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
21b10 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
21b20 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e  o.nKey;.  return
21b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21b40 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
21b50 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
21b60 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
21b70 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
21b80 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
21b90 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
21ba0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
21bb0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
21bc0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
21bd0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
21be0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
21bf0 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
21c00 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
21c10 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
21c20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
21c30 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
21c40 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
21c50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21c60 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65  D..**.** Failure
21c70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21c80 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
21c90 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
21ca0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74  SQLITE_OK..** It
21cb0 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77   might just as w
21cc0 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75  ell be a procedu
21cd0 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f  re (returning vo
21ce0 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69  id) but we conti
21cf0 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e  nue.** to return
21d00 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75   an integer resu
21d10 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74  lt code for hist
21d20 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a  orical reasons..
21d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21d40 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
21d50 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21d60 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
21d70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21d80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21d90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21da0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21db0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
21dc0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
21dd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21de0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
21df0 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
21e00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21e10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21e20 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20  ->intKeyLeaf==1 
21e30 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
21e40 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
21e50 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50   = pCur->info.nP
21e60 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
21e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21e80 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
21e90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
21ea0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
21eb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
21ec0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
21ed0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
21ee0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
21ef0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
21f00 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
21f10 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
21f20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
21f30 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
21f40 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
21f50 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
21f60 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
21f70 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
21f80 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
21f90 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
21fa0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
21fb0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
21fc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21fd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
21fe0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
21ff0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
22000 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
22010 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
22020 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
22030 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
22040 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
22050 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
22060 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
22070 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
22080 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
22090 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
220a0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
220b0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
220c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
220d0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
220e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
220f0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
22100 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
22110 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
22120 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
22130 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
22140 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
22150 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
22160 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
22170 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
22180 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
22190 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
221a0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
221b0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
221c0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
221d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
221e0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
221f0 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
22200 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
22210 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
22220 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
22230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
22240 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
22250 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22270 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
22280 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
22290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
222a0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
222b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
222c0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
222d0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
222e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
222f0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
22300 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
22310 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22330 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
22340 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
22350 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
22360 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
22370 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
22380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22390 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
223a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
223b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
223c0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
223d0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
223e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
223f0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
22400 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
22410 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
22420 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
22430 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
22440 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
22450 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
22460 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
22470 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
22480 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
22490 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
224a0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
224b0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
224c0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
224d0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
224e0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
224f0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
22500 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
22510 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
22520 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
22530 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
22540 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
22550 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
22560 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
22570 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
22580 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
22590 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
225a0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
225b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
225c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
225d0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
225e0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
225f0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
22600 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
22610 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
22620 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
22630 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
22640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22650 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
22660 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
22670 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
22680 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
22690 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
226a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
226b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
226c0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
226d0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
226e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
226f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22700 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
22710 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
22720 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
22730 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
22740 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
22750 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
22760 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
22770 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
22780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
227a0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
227b0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
227c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
227d0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
227e0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
227f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
22800 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
22810 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
22820 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
22830 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
22840 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
22850 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
22860 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
22870 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
22880 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
22890 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
228a0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
228b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
228c0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
228d0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
228e0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
228f0 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
22900 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
22910 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
22920 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
22930 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
22940 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
22950 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
22960 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
22970 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
22980 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
22990 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
229a0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
229b0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
229c0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
229d0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
229e0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
229f0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
22a00 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
22a10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
22a20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
22a30 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
22a40 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
22a50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22a60 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
22a70 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a90 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
22aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
22ab0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
22ad0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
22ae0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
22af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
22b00 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
22b10 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
22b20 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
22b30 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
22b40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
22b50 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
22b60 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
22b70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
22b80 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
22b90 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
22ba0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
22bb0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
22bc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22bd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
22be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
22c00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
22c10 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
22c20 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
22c30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
22c40 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
22c50 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
22c60 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
22c70 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
22c80 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
22c90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22cb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22cc0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
22cd0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
22ce0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
22cf0 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
22d00 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
22d10 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
22d20 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
22d30 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
22d40 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
22d50 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
22d60 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
22d70 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
22d80 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
22d90 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
22da0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
22db0 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
22dc0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
22dd0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20   cache..**   2: 
22de0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
22df0 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20   a read. Do not 
22e00 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
22e10 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
22e20 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
22e30 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
22e40 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
22e50 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
22e60 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
22e70 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
22e80 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
22e90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
22ea0 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
22eb0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
22ec0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
22ed0 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
22ee0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
22ef0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
22f00 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
22f10 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
22f20 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
22f30 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
22f40 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20  rflow pages and 
22f50 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d  the.** eOp argum
22f60 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68  ent is not 2, th
22f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
22f80 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
22f90 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a  or and lazily .*
22fa0 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  * populates the 
22fb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
22fc0 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
22fd0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
22fe0 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
22ff0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
23000 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
23010 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
23020 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
23030 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
23040 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
23050 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
23060 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
23070 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
23080 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
23090 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
230a0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
230b0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
230c0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
230d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
230e0 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
230f0 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
23100 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
23110 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
23120 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
23130 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
23140 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
23150 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
23160 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
23170 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
23180 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
23190 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
231a0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
231b0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
231c0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
231d0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
231e0 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
231f0 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
23200 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
23210 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
23220 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
23230 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
23240 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
23250 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
23260 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
23270 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
23280 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
23290 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
232a0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
232b0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
232c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
232d0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
232e0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
232f0 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
23300 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
23310 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
23320 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
23330 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
23340 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
23350 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
23360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23370 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
23380 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
23390 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
233a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
233b0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
233c0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
233d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
233e0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23400 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
23410 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
23420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23430 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23440 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
23450 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
23460 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69  tart = pBuf;.  i
23470 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20  nt bEnd;        
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
234a0 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65   if reading to e
234b0 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65  nd of data */.#e
234c0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
234d0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
234e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
234f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23500 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23510 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23520 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
23530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
23540 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23550 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23560 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73  ( eOp!=2 || offs
23570 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41  et==0 );    /* A
23580 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d  lways start from
23590 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65   beginning for e
235a0 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43  Op==2 */..  getC
235b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
235c0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
235d0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
235e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
235f0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
23600 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66  EAD.  bEnd = off
23610 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69  set+amt==pCur->i
23620 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65  nfo.nPayload;.#e
23630 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f  ndif.  assert( o
23640 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
23650 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
23660 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79   );..  if( &aPay
23670 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
23680 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
23690 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
236a0 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  bleSize] ){.    
236b0 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
236c0 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
236d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
236e0 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
236f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
23700 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23710 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
23720 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
23730 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
23740 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
23750 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
23760 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
23770 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23780 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
23790 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
237a0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
237b0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
237c0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
237d0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
237e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
237f0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
23800 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
23810 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30  Buf, a, (eOp & 0
23820 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62  x01), pPage->pDb
23830 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
23840 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
23850 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
23860 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
23870 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
23880 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
23890 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }...  if( rc==SQ
238a0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
238b0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
238c0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
238d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
238e0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
238f0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
23900 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
23910 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
23920 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
23930 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
23940 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
23950 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
23960 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
23970 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
23980 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
23990 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
239a0 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e   ** Except, do n
239b0 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65  ot allocate aOve
239c0 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d  rflow[] for eOp=
239d0 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =2..    **.    *
239e0 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
239f0 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
23a00 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
23a10 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
23a20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
23a30 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
23a40 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
23a50 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
23a60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
23a70 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
23a80 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
23a90 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
23aa0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
23ab0 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
23ac0 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
23ad0 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
23ae0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
23af0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
23b00 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26      if( eOp!=2 &
23b10 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
23b20 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
23b30 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
23b40 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
23b50 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
23b60 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
23b70 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
23b80 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
23b90 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e  f( nOvfl>pCur->n
23ba0 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  OvflAlloc ){.   
23bb0 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
23bc0 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
23bd0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
23be0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
23bf0 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
23c00 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
23c10 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
23c20 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
23c30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23c40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23c60 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
23c70 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
23c80 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
23c90 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
23ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23cb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
23cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23cd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
23ce0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
23cf0 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
23d00 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43  no));.        pC
23d10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
23d20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
23d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
23d50 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
23d60 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
23d70 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
23d80 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
23d90 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
23da0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
23db0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
23dc0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
23dd0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
23de0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
23df0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
23e00 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20  alidOvfl)!=0.   
23e10 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72    && pCur->aOver
23e20 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
23e30 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20  Size].    ){.   
23e40 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
23e50 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
23e60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
23e70 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
23e80 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
23e90 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
23ea0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Size);.    }..  
23eb0 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
23ec0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
23ed0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
23ee0 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20  x++){..      /* 
23ef0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
23f00 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
23f10 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
23f20 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
23f30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
23f40 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
23f50 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
23f60 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
23f70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
23f80 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
23f90 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
23fa0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
23fb0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
23fc0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
23fd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
23fe0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
23ff0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
24000 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
24010 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
24020 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
24030 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
24040 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
24050 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24060 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
24070 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
24080 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
24090 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
240a0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
240b0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
240c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
240d0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
240e0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
240f0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
24100 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
24110 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
24120 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24130 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
24140 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
24150 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
24160 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
24170 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
24180 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
24190 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
241a0 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
241b0 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
241c0 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
241d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
241e0 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
241f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24200 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
24210 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
24220 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24230 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
24240 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
24250 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
24260 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
24270 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
24280 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
24290 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
242a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
242b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
242c0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
242d0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
242e0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
242f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
24300 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
24310 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24320 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
24330 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
24340 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
24350 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
24360 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
24370 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
24380 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
24390 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
243a0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
243b0 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
243c0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
243d0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
243e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
243f0 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
24400 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
24410 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
24420 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
24430 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
24440 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
24450 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
24460 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24470 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
24480 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
24490 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
244a0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
244b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
244c0 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
244d0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
244e0 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
244f0 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
24500 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
24510 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
24520 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
24530 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24540 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
24550 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
24560 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
24570 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
24580 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
24590 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
245a0 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
245b0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
245c0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
245d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
245e0 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
245f0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
24600 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
24610 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
24620 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
24630 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
24640 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
24650 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
24660 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
24670 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
24680 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
24690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
246a0 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
246b0 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
246c0 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
246d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
246e0 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
246f0 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
24700 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
24710 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
24720 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
24730 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
24740 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
24750 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
24790 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
247a0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
247d0 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
247e0 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
247f0 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
24820 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
24830 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
24840 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24860 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
24870 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
24880 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
24890 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
248a0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
248b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
248c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
248d0 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
24900 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
24910 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
24940 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
24950 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
24960 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
24970 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
24980 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
24990 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
249a0 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
249d0 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
249e0 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
249f0 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
24a00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24a10 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
24a20 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
24a30 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
24a40 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
24a50 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
24a60 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
24a70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
24a80 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
24a90 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
24aa0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
24ab0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
24ac0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
24ad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24ae0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
24af0 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
24b00 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
24b10 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
24b20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30    ((eOp&0x01)==0
24b30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
24b40 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
24b50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
24b80 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
24b90 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
24ba0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
24bb0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
24bc0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
24bd0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
24be0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
24bf0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
24c00 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
24c10 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44  , (eOp&0x01), pD
24c20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
24c30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24c40 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
24c50 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
24c60 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
24c70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24c80 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
24c90 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
24ca0 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
24cb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
24cc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
24cd0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
24ce0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24cf0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
24d00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24d10 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
24d20 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
24d30 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
24d40 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
24d50 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
24d60 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
24d70 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
24d80 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
24d90 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
24da0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
24db0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
24dc0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
24dd0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
24de0 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
24df0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
24e00 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
24e10 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
24e20 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
24e30 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
24e40 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
24e50 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
24e60 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
24e70 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
24e80 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
24e90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24ea0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
24eb0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
24ec0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
24ed0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
24ee0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24ef0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24f00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24f10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24f20 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
24f30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
24f40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24f50 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
24f60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
24f70 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24f80 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
24f90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24fa0 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
24fb0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
24fc0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
24fd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
24fe0 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
24ff0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
25000 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
25010 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
25020 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
25030 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
25040 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
25050 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
25060 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
25070 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
25080 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25090 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
250a0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
250b0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
250c0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
250d0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
250e0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
250f0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
25100 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
25110 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
25120 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25130 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
25140 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
25150 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
25160 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
25170 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
25180 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
25190 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
251a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
251b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
251c0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
251d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
251e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
251f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25200 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
25210 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
25220 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
25230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25250 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25260 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
25270 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
25280 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
25290 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
252a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
252b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
252c0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
252d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
252e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
252f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
25300 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
25310 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
25320 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
25340 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
25350 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
25360 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
25370 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
25380 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25390 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
253a0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
253b0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
253c0 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20  he key if index 
253d0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
253e0 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73  ntKey==0) and is
253f0 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a   the data for.**
25400 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70   table btrees (p
25410 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29  Page->intKey==1)
25420 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
25430 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
25440 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69  le.** key/data i
25450 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
25460 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
25470 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
25480 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  ue.** returned w
25490 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c  ill not be a val
254a0 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
254b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
254c0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
254d0 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
254e0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
254f0 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
25500 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
25510 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
25520 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
25530 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
25540 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
25550 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
25560 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
25570 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
25580 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
25590 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
255a0 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
255b0 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
255c0 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
255d0 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
255e0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
255f0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
25600 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
25610 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
25620 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
25630 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
25640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
25650 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
25660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
25670 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
25680 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
25690 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
256a0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
256b0 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
256c0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
256d0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
256e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
256f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
25700 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79  t void *fetchPay
25710 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
25720 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25730 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25740 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25750 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a   from */.  u32 *
25760 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20  pAmt            
25770 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
25780 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
25790 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29   bytes here */.)
257a0 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61  {.  u32 amt;.  a
257b0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
257c0 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
257d0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
257e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
257f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25800 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25810 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
25820 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25830 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
25840 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
25850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25880 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25890 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
258a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
258b0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
258c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
258d0 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
258e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
258f0 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
25900 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25910 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
25920 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
25930 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
25940 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
25950 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25960 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
25970 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
25980 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
25990 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
259a0 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
259b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
259c0 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
259d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
259e0 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
259f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
25a00 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
25a10 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
25a20 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25a30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
25a40 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
25a50 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
25a60 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
25a70 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
25a80 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
25a90 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
25aa0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
25ab0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
25ac0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
25ad0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25ae0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
25af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
25b00 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
25b10 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
25b20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
25b30 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
25b40 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
25b50 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
25b60 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
25b70 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
25b80 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
25b90 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
25ba0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
25bb0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
25bc0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
25bd0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
25be0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
25bf0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
25c00 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
25c10 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
25c20 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
25c30 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
25c40 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
25c50 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
25c60 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
25c70 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
25c80 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
25c90 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
25ca0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
25cb0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
25cc0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
25cd0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
25ce0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
25cf0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
25d00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
25d10 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
25d20 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
25d30 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
25d40 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
25d50 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
25d60 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
25d70 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
25d80 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
25d90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25da0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
25db0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
25dc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
25dd0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
25de0 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
25df0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
25e00 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
25e10 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
25e20 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
25e30 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
25e40 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
25e50 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
25e60 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
25e70 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
25e80 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
25e90 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
25ea0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
25eb0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
25ec0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25ed0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
25ee0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
25ef0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
25f00 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
25f10 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
25f20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25f30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25f40 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25f50 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25f60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25f70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25f80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
25f90 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
25fa0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
25fb0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
25fc0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
25fd0 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
25fe0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
25ff0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26000 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26010 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
26020 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
26030 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
26040 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  wPage,.         
26050 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
26060 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
26070 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
26080 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
26090 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
260a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
260b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
260c0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
260d0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
260e0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
260f0 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
26100 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26110 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26120 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
26130 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
26140 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61  l);.  if( pNewPa
26150 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
26160 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
26170 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
26180 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
26190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
261a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
261b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
261c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
261d0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
261e0 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
261f0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
26200 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
26210 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
26220 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
26230 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
26240 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
26250 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
26260 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
26270 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
26280 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
26290 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
262a0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
262b0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
262c0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
262d0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
262e0 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
262f0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
26300 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
26310 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
26320 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
26330 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
26340 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
26350 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
26360 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
26370 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
26380 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
263b0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
263c0 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
263d0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
263e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
263f0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
26400 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
26410 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
26420 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
26430 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
26440 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
26450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
26460 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
26470 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
26480 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
26490 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
264a0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
264b0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
264c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
264d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
264e0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
264f0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
26500 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
26510 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
26520 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
26530 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
26540 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
26550 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
26560 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
26570 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
26580 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
26590 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
265a0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
265b0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
265c0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
265d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
265e0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
265f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26600 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26610 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26630 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26640 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26650 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26660 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26670 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26680 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
26690 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
266a0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
266b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
266c0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
266d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
266e0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
266f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26700 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
26710 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
26720 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26730 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
26740 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26750 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
26760 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
26770 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26780 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
26790 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
267a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
267b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
267c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
267d0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
267e0 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ovfl);.}../*.** 
267f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
26800 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
26810 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
26820 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
26830 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26840 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
26850 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
26860 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
26870 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
26880 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
26890 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
268a0 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
268b0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
268c0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
268d0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
268e0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
268f0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
26900 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
26910 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
26920 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
26930 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
26940 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
26950 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
26960 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
26970 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
26980 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
26990 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
269a0 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
269b0 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
269c0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
269d0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
269e0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
269f0 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
26a00 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
26a10 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
26a20 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
26a30 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
26a40 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
26a50 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
26a60 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
26a70 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
26a80 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
26a90 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
26aa0 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
26ab0 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
26ac0 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
26ad0 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
26ae0 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
26af0 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
26b00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
26b10 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
26b20 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
26b30 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
26b40 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
26b50 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
26b60 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
26b70 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
26b80 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
26b90 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
26ba0 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
26bb0 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
26bc0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
26bd0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
26be0 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
26bf0 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
26c00 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
26c10 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
26c20 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
26c30 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
26c40 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
26c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26c60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26c70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26c90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
26ca0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
26cc0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
26cd0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26ce0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
26cf0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
26d00 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
26d10 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
26d20 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
26d30 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
26d40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
26d50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
26d60 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
26d70 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
26d80 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
26d90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
26da0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
26db0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
26dc0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
26dd0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
26de0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
26df0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
26e00 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c  Cur->iPage ) rel
26e10 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
26e20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26e30 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e--]);.  }else i
26e40 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
26e50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
26e60 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
26e70 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
26e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26e90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
26ea0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
26eb0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
26ec0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
26ed0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
26ee0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
26ef0 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
26f00 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
26f10 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
26f20 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26f30 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Y : 0);.    if( 
26f40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26f50 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
26f60 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
26f70 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
26f80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26f90 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
26fa0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
26fb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
26fc0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
26fd0 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
26fe0 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
26ff0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
27000 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
27010 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
27020 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
27030 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
27040 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
27050 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
27060 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
27070 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
27080 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
27090 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
270a0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
270b0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
270c0 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
270d0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
270e0 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
270f0 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
27100 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
27110 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
27120 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
27130 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
27140 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
27150 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
27160 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27170 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
27180 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
27190 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
271a0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
271b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
271c0 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
271d0 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
271e0 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
271f0 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
27200 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
27210 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
27220 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
27230 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
27240 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
27250 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
27260 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
27270 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
27280 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
27290 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
272a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
272b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
272c0 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  PT;.  }..  pCur-
272d0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
272e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
272f0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
27300 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
27310 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
27320 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
27330 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20  idOvfl);..  if( 
27340 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
27350 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
27360 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
27370 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
27380 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
27390 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
273a0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
273b0 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
273c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
273d0 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
273e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
273f0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
27400 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27410 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27420 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
27430 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
27440 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
27450 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
27460 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27470 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
27480 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
27490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
274a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
274b0 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
274c0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
274d0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
274e0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
274f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27500 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
27510 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
27520 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
27530 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
27540 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
27550 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
27560 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27570 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
27580 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27590 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
275a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
275b0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
275c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
275d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
275e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
275f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27600 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27610 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
27620 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
27630 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
27640 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27650 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
27660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27670 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
27690 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
276a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
276b0 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
276c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
276d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
276e0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
276f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27700 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
27710 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
27720 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
27730 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
27740 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
27750 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
27760 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27770 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
27780 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
27790 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
277a0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
277b0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
277c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
277d0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
277e0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
277f0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
27800 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
27810 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
27820 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
27830 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
27840 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
27850 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
27860 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
27870 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
27880 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
27890 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
278a0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
278b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
278c0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
278d0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
278e0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
278f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27900 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27910 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
27920 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27930 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27940 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27950 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27960 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
27970 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
27980 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27990 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
279a0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
279b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
279c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
279d0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
279e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
279f0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
27a00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
27a10 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
27a20 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
27a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
27a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27a50 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
27a60 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
27a70 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27a80 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
27a90 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
27aa0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27ab0 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
27ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27ad0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
27ae0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
27af0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
27b00 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
27b10 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
27b20 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
27b30 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
27b40 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
27b50 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
27b60 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
27b70 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
27b80 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
27b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
27ba0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
27bb0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27bc0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27bd0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27be0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27bf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
27c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27c10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
27c20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
27c30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
27c40 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
27c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
27c70 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
27c80 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
27c90 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
27ca0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
27cb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27cc0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
27cd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27cf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27d00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27d10 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
27d20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27d30 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
27d40 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
27d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
27d70 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
27d80 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
27d90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
27da0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27db0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
27dc0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
27dd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
27de0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
27df0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
27e00 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
27e10 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
27e20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
27e30 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
27e40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
27e50 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
27e60 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
27e70 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27e80 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27e90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27ea0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
27eb0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
27ec0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
27ed0 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
27ee0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
27ef0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
27f00 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
27f10 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
27f20 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
27f30 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
27f40 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
27f50 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
27f60 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
27f70 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
27f80 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
27f90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
27fa0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
27fb0 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
27fc0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
27fd0 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
27fe0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
27ff0 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
28000 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
28010 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28020 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
28030 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
28040 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
28050 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28060 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28070 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
28080 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28090 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
280a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
280b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
280c0 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
280d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
280e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
280f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
28100 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
28110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28120 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
28130 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
28140 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28150 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28160 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
28170 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28180 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
28190 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
281a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
281b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
281c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
281d0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
281e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
281f0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
28200 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69  t(pCur);.      i
28210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
28230 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
28240 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
28250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28260 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28270 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
28280 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20        }.   .    
28290 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
282a0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
282b0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
282c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
282d0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
282e0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
282f0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
28300 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
28310 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
28320 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
28330 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
28340 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
28350 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
28360 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
28370 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
28380 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
28390 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
283a0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
283b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
283c0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
283d0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
283e0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
283f0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
28400 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
28410 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
28420 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
28430 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
28440 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
28450 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
28460 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
28470 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
28480 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
28490 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
284a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
284b0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
284c0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
284d0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
284e0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
284f0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
28500 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
28510 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
28520 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
28530 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
28540 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
28550 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
28560 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
28570 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
28580 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
28590 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
285b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
285c0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
285d0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
285e0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
285f0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
28600 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
28610 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
28620 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
28630 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
28640 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
28650 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
28660 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
28670 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
28680 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
28690 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
286a0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
286b0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
286c0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
286d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
286e0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
286f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
28700 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
28710 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
28720 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28730 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
28740 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
28750 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
28760 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
28770 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
28780 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
28790 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
287a0 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
287b0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
287c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
287d0 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
287e0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
287f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
28800 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
28810 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
28820 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
28830 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
28840 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
28850 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
28860 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
28870 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
28880 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
28890 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
288a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
288b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
288c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
288d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
288e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
288f0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
28900 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
28910 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
28920 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
28930 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
28940 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
28950 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
28960 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
28970 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
28980 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
28990 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
289a0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
289b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
289c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
289d0 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
289e0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
289f0 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75  ey)!=0.   && pCu
28a00 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
28a10 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
28a20 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
28a30 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
28a40 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
28a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28a60 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
28a70 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
28a80 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
28a90 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
28aa0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
28ab0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
28ac0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
28ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28ae0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
28af0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
28b00 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
28b10 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
28b20 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
28b30 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
28b40 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
28b50 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
28b60 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
28b70 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
28b80 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
28b90 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
28ba0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
28bb0 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
28bc0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
28bd0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
28be0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
28bf0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
28c00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
28c10 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
28c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
28c30 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
28c40 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28c50 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28c60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
28c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28c80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
28c90 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
28ca0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
28cb0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
28cc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28cd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
28ce0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28cf0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
28d00 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
28d10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28d20 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
28d30 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
28d40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
28d50 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
28d60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28d70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
28d80 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
28d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28da0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28db0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
28dc0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
28dd0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
28de0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
28df0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
28e00 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
28e10 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
28e20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28e30 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
28e40 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e60 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
28e70 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
28e80 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
28e90 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
28ea0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
28eb0 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
28ec0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
28ed0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
28ee0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
28ef0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
28f00 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
28f10 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
28f20 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
28f30 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
28f40 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
28f50 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
28f60 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
28f70 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
28f80 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
28f90 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
28fa0 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
28fb0 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
28fc0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
28fd0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
28fe0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
28ff0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
29000 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
29010 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
29020 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
29030 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
29040 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29050 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
29060 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
29070 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
29080 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
29090 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
290a0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
290b0 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
290c0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
290d0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
290e0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
290f0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
29100 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
29110 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
29120 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
29130 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29140 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
29150 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
29160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
29170 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
29180 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
29190 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
291a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
291b0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
291c0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
291d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
291e0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
291f0 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
29200 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
29210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29220 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
29230 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
29240 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29250 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
29260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29270 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
29280 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
29290 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
292a0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
292b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
292c0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
292d0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
292e0 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
292f0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
29300 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
29310 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
29320 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
29330 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29340 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
29350 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
29360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29370 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
29380 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
29390 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
293a0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
293b0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
293c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
293d0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
293e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
293f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29400 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29420 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
29430 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
29440 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
29450 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
29460 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
29470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29480 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
29490 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
294a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
294b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
294c0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
294d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
294e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
294f0 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
29500 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
29510 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
29520 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
29530 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
29540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29550 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
29560 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
29570 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
29580 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
29590 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
295a0 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20  dPtrSize;..     
295b0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
295c0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
295d0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
295e0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
295f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
29600 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
29610 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
29620 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
29630 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
29640 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
29650 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
29660 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
29670 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
29680 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
29690 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
296a0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
296b0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
296c0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
296d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
296e0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
296f0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
29700 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
29710 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
29720 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
29730 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
29740 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
29750 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
29760 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
29770 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
29780 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
29790 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
297a0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
297b0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
297c0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
297d0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
297e0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
297f0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
29800 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
29810 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
29820 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
29830 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
29840 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
29850 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
29860 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
29870 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
29880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
29890 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
298a0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
298b0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
298c0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
298d0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
298e0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
298f0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
29900 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
29910 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
29920 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
29930 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
29940 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
29950 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
29960 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
29970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29980 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
29990 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
299a0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
299b0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
299c0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
299d0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
299e0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
299f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29a00 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
29a10 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
29a20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
29a30 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
29a40 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
29a50 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
29a60 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
29a70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
29a80 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
29a90 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
29aa0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
29ab0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
29ac0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
29ad0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
29ae0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
29af0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
29b00 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
29b10 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
29b20 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
29b30 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
29b40 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
29b50 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
29b60 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
29b70 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
29b80 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
29b90 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
29ba0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
29bb0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
29bc0 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
29bd0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
29be0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
29bf0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
29c00 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
29c10 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
29c20 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
29c30 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
29c40 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
29c50 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
29c60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
29c70 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
29c80 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
29c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29cb0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
29cc0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
29cd0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
29ce0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
29cf0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29d00 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
29d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
29d20 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
29d30 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
29d40 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
29d50 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
29d60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
29d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29d80 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
29d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29da0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29dc0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
29dd0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
29de0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
29df0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
29e00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
29e10 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
29e20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29e30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
29e40 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
29e50 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
29e60 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
29e70 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
29e80 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
29e90 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
29ea0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
29eb0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
29ec0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
29ed0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
29ee0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
29ef0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
29f00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
29f10 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
29f20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
29f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
29f50 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
29f60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29f70 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
29f80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29f90 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
29fa0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
29fb0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
29fc0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
29fd0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
29fe0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
29ff0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2a000 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2a010 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2a020 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2a030 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2a040 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2a050 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2a060 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2a070 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2a080 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2a090 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2a0a0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2a0b0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2a0c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a0d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2a0e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2a0f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a100 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a110 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
2a120 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a130 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2a140 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a150 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2a160 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2a170 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2a180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a190 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2a1a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2a1b0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2a1c0 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2a1d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2a1e0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2a1f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2a200 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a210 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2a220 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2a230 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2a240 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2a250 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2a260 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a270 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
2a280 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2a290 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2a2a0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2a2b0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2a2c0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2a2d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a2e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2a2f0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2a300 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a310 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
2a320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2a330 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2a340 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2a350 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2a360 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2a370 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2a380 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2a390 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2a3a0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2a3b0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2a3c0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2a3d0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2a3e0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2a3f0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2a400 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2a410 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2a420 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2a430 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2a440 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2a450 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2a460 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2a470 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2a480 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2a490 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2a4a0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2a4b0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2a4c0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2a4d0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2a4e0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2a4f0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2a500 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2a510 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2a520 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2a530 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2a540 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2a550 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2a560 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
2a570 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
2a580 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
2a590 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
2a5a0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
2a5b0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
2a5c0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
2a5d0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
2a5e0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
2a5f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2a600 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2a610 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2a620 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2a630 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2a640 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2a650 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2a660 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
2a670 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2a680 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2a690 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2a6a0 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
2a6b0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2a6c0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2a6d0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2a6e0 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
2a6f0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2a700 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2a710 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
2a720 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2a730 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2a740 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2a750 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2a760 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
2a770 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2a780 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2a790 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2a7a0 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2a7b0 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2a7c0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2a7d0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2a7e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2a7f0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2a800 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2a810 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2a820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2a830 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2a840 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2a850 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2a860 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2a870 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2a880 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2a890 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2a8a0 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2a8b0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2a8c0 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2a8d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2a8e0 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2a8f0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2a900 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2a910 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2a920 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2a930 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2a940 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2a950 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2a960 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2a970 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2a980 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2a990 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2a9a0 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2a9b0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2a9c0 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2a9d0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2a9e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2a9f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2aa00 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2aa10 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2aa20 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2aa30 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2aa40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2aa50 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2aa60 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2aa70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2aa80 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2aa90 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2aaa0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2aab0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2aac0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2aad0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2aae0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2aaf0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2ab00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2ab10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ab20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2ab30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2ab40 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2ab50 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2ab60 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2ab70 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2ab80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ab90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2aba0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2abb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2abc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2abd0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2abe0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2abf0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2ac00 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ac10 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2ac20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2ac30 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2ac40 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ac50 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2ac60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ac70 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2ac80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2ac90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2aca0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2acb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2acc0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2acd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2ace0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2acf0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2ad00 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2ad10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ad20 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2ad30 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2ad40 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2ad50 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2ad60 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2ad70 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2ad80 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2ad90 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2ada0 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2adb0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2adc0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2add0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2ade0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2adf0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2ae00 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2ae10 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2ae20 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2ae30 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2ae40 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2ae50 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2ae60 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2ae70 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2ae80 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2ae90 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2aea0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2aeb0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2aec0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2aed0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2aee0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2aef0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2af00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2af10 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2af20 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2af30 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2af40 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2af50 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2af60 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2af70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2af80 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2af90 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2afa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2afb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2afc0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2afd0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2afe0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2aff0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2b000 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2b010 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b020 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2b030 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2b040 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2b050 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2b060 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2b070 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2b080 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2b090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b0a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2b0b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b0d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2b0e0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2b0f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2b100 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2b110 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2b120 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2b130 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2b140 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2b150 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2b160 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b170 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2b180 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2b190 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2b1a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b1b0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2b1c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2b1d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2b1e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b1f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2b200 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2b210 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2b220 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70  ValidOvfl);.  *p
2b230 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
2b240 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2b250 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2b260 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2b270 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67  r, pRes);.  pPag
2b280 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b290 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2b2a0 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69   if( (++pCur->ai
2b2b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b2c0 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2b2d0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
2b2e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2b2f0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2b300 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2b310 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  es);.  }.  if( p
2b320 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b340 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2b350 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2b360 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2b370 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2b380 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b390 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2b3a0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2b3b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2b3c0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2b3d0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2b3e0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2b3f0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2b400 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2b410 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2b420 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2b430 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2b440 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2b450 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2b460 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2b470 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2b480 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2b490 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2b4a0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2b4b0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2b4c0 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2b4d0 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2b4e0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2b4f0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2b500 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2b510 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2b520 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2b530 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2b540 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2b550 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2b560 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2b570 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2b580 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2b590 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2b5a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2b5b0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2b5c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2b5d0 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2b5e0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2b5f0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2b600 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2b610 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2b620 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2b630 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2b640 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2b650 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2b660 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2b670 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2b680 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2b690 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2b6a0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2b6b0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2b6c0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2b6d0 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2b6e0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2b6f0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2b700 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2b710 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2b720 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2b730 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2b740 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2b750 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2b760 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2b770 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2b780 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2b790 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2b7a0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2b7b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2b7c0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2b7d0 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2b7e0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2b7f0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2b800 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2b810 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2b820 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2b830 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b840 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b850 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2b860 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b870 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2b880 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2b890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b8a0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2b8b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2b8c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2b8d0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2b8e0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2b8f0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2b900 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2b910 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2b920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2b930 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2b940 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2b950 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2b960 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2b970 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2b980 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2b990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b9a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2b9b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2b9c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2b9d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2b9e0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2b9f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2ba00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2ba10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2ba20 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2ba30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ba40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ba50 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2ba60 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2ba70 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2ba80 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2ba90 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2baa0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2bab0 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2bac0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2bad0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2bae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2baf0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2bb00 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2bb10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2bb20 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2bb30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2bb40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bb50 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2bb60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2bb70 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2bb80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2bb90 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2bba0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2bbb0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2bbc0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2bbd0 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2bbe0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2bbf0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2bc00 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2bc10 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2bc20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bc30 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2bc40 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2bc50 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2bc60 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2bc70 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2bc80 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2bc90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2bca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bcb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2bcc0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2bcd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2bce0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2bcf0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2bd00 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2bd10 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2bd20 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2bd30 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
2bd40 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2bd50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2bd60 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
2bd70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2bd80 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
2bd90 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2bda0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2bdb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2bdc0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2bdd0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2bde0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2bdf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2be00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2be10 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2be20 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2be30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2be40 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61   int *pRes){.  a
2be50 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2be60 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2be70 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2be80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2be90 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2bea0 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2beb0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2bec0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2bed0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2bee0 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
2bef0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2bf00 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2bf10 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2bf20 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2bf30 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
2bf40 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
2bf50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2bf60 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
2bf70 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  || pCur->aiIdx[p
2bf80 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20  Cur->iPage]==0. 
2bf90 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67    || pCur->apPag
2bfa0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2bfb0 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
2bfc0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
2bfd0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2bfe0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  );.  }.  pCur->a
2bff0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c000 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ]--;.  return SQ
2c010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2c020 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2c030 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
2c040 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2c050 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
2c060 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
2c070 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
2c080 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
2c090 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
2c0a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2c0b0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
2c0c0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
2c0d0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
2c0e0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
2c0f0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
2c100 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
2c110 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
2c120 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
2c130 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
2c140 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
2c150 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
2c160 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2c170 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
2c180 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
2c190 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2c1a0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
2c1b0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
2c1c0 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
2c1d0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
2c1e0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
2c1f0 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
2c200 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2c210 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
2c220 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
2c230 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
2c240 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
2c250 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2c260 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
2c270 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
2c280 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
2c290 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
2c2a0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
2c2b0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
2c2c0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
2c2d0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
2c2e0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
2c2f0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
2c300 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c310 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
2c320 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
2c330 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
2c340 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
2c350 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
2c360 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
2c370 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
2c380 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
2c390 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
2c3a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2c3b0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
2c3c0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
2c3d0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
2c3e0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
2c3f0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
2c400 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
2c410 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2c420 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
2c430 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
2c440 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
2c450 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
2c460 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
2c470 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
2c480 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
2c490 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2c4a0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
2c4b0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
2c4c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2c4d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
2c4e0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2c4f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2c500 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
2c510 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2c520 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
2c530 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
2c540 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2c550 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2c560 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2c570 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
2c580 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2c590 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
2c5a0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
2c5b0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
2c5c0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
2c5d0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
2c5e0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
2c5f0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2c600 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
2c610 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
2c620 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2c630 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2c640 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
2c650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
2c660 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
2c670 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
2c680 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
2c690 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
2c6a0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
2c6b0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
2c6c0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
2c6d0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
2c6e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c6f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c700 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2c710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2c720 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
2c730 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
2c740 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
2c750 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
2c760 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
2c770 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2c780 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
2c790 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2c7a0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
2c7b0 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
2c7c0 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
2c7d0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2c7e0 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
2c7f0 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
2c800 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2c810 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2c820 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
2c830 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2c840 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2c850 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
2c860 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
2c870 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
2c880 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c890 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c8a0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
2c8b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2c8c0 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
2c8d0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
2c8e0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
2c8f0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
2c900 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
2c910 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
2c920 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
2c930 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
2c940 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
2c950 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
2c960 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
2c970 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
2c980 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
2c990 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
2c9a0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
2c9b0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
2c9c0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
2c9d0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
2c9e0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2c9f0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
2ca00 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
2ca10 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
2ca20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ca30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2ca40 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2ca50 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
2ca60 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
2ca70 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2ca80 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2ca90 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
2caa0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
2cab0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
2cac0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
2cad0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2cae0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
2caf0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
2cb00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2cb10 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
2cb20 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
2cb30 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2cb40 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2cb50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2cb70 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
2cb80 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
2cb90 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2cba0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2cbb0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
2cbc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
2cbd0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
2cbe0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
2cbf0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
2cc00 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
2cc10 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
2cc20 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
2cc30 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
2cc40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cc50 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
2cc60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2cc70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2cc80 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
2cc90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2cca0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
2ccb0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
2ccc0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
2ccd0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
2cce0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
2ccf0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
2cd00 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
2cd10 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
2cd20 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
2cd30 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
2cd40 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
2cd50 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
2cd60 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2cd70 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2cd80 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
2cd90 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
2cda0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
2cdb0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2cdc0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2cdd0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
2cde0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
2cdf0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
2ce00 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
2ce10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2ce20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ce30 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
2ce40 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
2ce50 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
2ce60 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
2ce70 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
2ce80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2ce90 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
2cea0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
2ceb0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
2cec0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
2ced0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
2cee0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
2cef0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
2cf00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
2cf10 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2cf20 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2cf30 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2cf40 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
2cf50 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
2cf60 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2cf70 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2cf80 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
2cf90 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
2cfa0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
2cfb0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
2cfc0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
2cfd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2cfe0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
2cff0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
2d000 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2d010 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2d020 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
2d030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2d040 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2d050 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
2d060 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
2d070 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d080 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d0a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2d0b0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2d0c0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2d0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d0e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2d0f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2d100 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2d110 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2d120 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2d130 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2d140 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2d150 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2d160 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2d170 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2d180 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2d190 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2d1a0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2d1b0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2d1c0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2d1d0 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2d1e0 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2d1f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2d200 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2d210 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2d220 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2d230 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2d240 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2d250 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2d260 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2d270 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2d280 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2d290 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2d2a0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2d2b0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2d2c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2d2d0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2d2e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2d2f0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2d300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d310 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2d320 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2d330 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2d340 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2d350 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d370 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2d380 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2d390 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2d3a0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2d3b0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2d3c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2d3d0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2d3e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2d3f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2d400 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2d410 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2d420 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2d430 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2d440 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2d450 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2d460 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2d470 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2d480 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2d490 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2d4a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2d4b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d4c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2d4d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d4e0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2d4f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d500 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2d510 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2d520 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2d530 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2d540 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2d550 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2d560 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2d570 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d580 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2d590 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2d5a0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2d5b0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2d5c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2d5d0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2d5e0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2d5f0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2d600 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2d610 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2d620 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2d630 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2d640 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2d650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d660 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d670 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2d680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2d6a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d6b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2d6c0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2d6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2d6e0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2d6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2d700 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2d710 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2d720 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2d730 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2d740 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d750 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d760 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2d770 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2d780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d7a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d7b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d7d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2d7e0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2d7f0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2d800 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2d810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d830 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2d840 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2d850 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2d860 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2d870 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2d880 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2d890 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2d8a0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2d8b0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2d8c0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2d8d0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2d8e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d8f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2d900 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2d910 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2d920 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2d930 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2d940 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2d950 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2d970 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2d980 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2d990 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d9a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2d9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d9c0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2d9d0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2d9e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2d9f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2da00 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2da10 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2da20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2da30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2da40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2da50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2da60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2da70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2da80 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2da90 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2daa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2dab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2dad0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
2dae0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
2daf0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2db00 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2db10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
2db20 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2db30 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2db40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2db50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
2db60 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
2db70 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
2db80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2db90 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2dba0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
2dbb0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
2dbc0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
2dbd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2dbe0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2dbf0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2dc00 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2dc10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dc20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2dc30 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2dc40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2dc50 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2dc60 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
2dc70 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2dc80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dc90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2dca0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2dcb0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2dcc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2dcd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2dce0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2dcf0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2dd10 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2dd20 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2dd30 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
2dd40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2dd50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dd60 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2dd70 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2dd80 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2dd90 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2dda0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2ddb0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
2ddc0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2ddd0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
2dde0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
2ddf0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
2de00 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
2de10 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
2de20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
2de30 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2de40 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
2de50 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
2de60 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
2de70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
2de80 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
2de90 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2dea0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
2deb0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2dec0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2ded0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
2def0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2df00 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
2df10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2df20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
2df30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2df40 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2df60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2df70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2df80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2df90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2dfa0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
2dfb0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
2dfc0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2dfd0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
2dfe0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2dff0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2e000 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2e010 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
2e020 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2e030 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2e040 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
2e050 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2e060 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
2e070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e080 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0a0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
2e0b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e0d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2e0e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
2e0f0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2e100 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
2e110 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2e120 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2e130 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
2e140 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2e150 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2e160 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
2e170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e180 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e190 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2e1a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2e1b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2e1c0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2e1d0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2e1e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2e1f0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
2e200 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
2e210 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
2e220 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
2e230 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2e240 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
2e250 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
2e260 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
2e270 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
2e280 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
2e290 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2e2a0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
2e2b0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2d0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
2e2e0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
2e300 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
2e310 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
2e320 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
2e330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e340 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2e350 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2e360 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e370 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2e380 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
2e390 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
2e3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2e3b0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
2e3c0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
2e3d0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
2e3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e3f0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
2e400 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
2e410 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
2e420 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
2e430 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
2e440 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
2e450 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2e460 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2e470 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2e480 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2e490 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2e4a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e4c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e4d0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2e4e0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2e4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e520 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2e530 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e550 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2e560 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2e570 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e580 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e590 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2e5a0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2e5b0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2e5c0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2e5d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2e5e0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2e5f0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2e600 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2e610 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2e620 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2e630 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2e640 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2e650 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2e660 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2e670 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2e680 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2e690 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2e6a0 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2e6b0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2e6c0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2e6d0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2e6e0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2e6f0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2e700 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2e710 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2e720 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2e730 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2e740 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2e750 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2e760 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2e770 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2e780 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2e790 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2e7a0 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2e7b0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2e7c0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2e7d0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2e7e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2e7f0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2e800 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2e810 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2e820 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2e830 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2e840 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2e850 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2e860 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2e870 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2e880 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2e890 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2e8a0 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2e8b0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2e8c0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2e8d0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2e8e0 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2e8f0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2e900 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2e910 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2e920 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2e930 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2e940 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2e950 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2e960 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2e970 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2e980 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2e990 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2e9a0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2e9b0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2e9c0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2e9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e9e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2e9f0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2ea00 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2ea10 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2ea20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2ea30 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
2ea40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ea50 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
2ea60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ea70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ea80 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
2ea90 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
2eaa0 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
2eab0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2eac0 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
2ead0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2eae0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2eaf0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2eb00 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
2eb10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2eb20 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
2eb30 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
2eb40 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
2eb50 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
2eb60 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
2eb70 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
2eb80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2eb90 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
2eba0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
2ebb0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
2ebc0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
2ebd0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
2ebe0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
2ebf0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
2ec00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
2ec10 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
2ec20 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
2ec30 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2ec40 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2ec50 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
2ec60 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
2ec70 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
2ec80 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
2ec90 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
2eca0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2ecb0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2ecc0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42 74  GetPage(pBt, pBt
2ecd0 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
2ece0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2ecf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ed00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2ed10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ed20 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
2ed30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2ed40 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
2ed50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ed60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ed70 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
2ed80 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
2ed90 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2eda0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2edb0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
2edc0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
2edd0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
2ede0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
2edf0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
2ee00 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
2ee10 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
2ee20 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
2ee30 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2ee40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2ee50 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2ee60 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2ee70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
2ee80 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
2ee90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2eea0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2eeb0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2eec0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2eed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2eee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2eef0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2ef00 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2ef10 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2ef20 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2ef30 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
2ef40 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
2ef50 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2ef60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ef70 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
2ef80 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
2ef90 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2efa0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2efb0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
2efc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2efd0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2efe0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2eff0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
2f000 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
2f010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2f020 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
2f030 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
2f040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f050 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f060 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
2f070 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
2f080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
2f090 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  age = 0;.  }.  a
2f0a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2f0b0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
2f0c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2f0d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2f0e0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
2f0f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2f110 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
2f120 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
2f130 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
2f140 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
2f150 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
2f160 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2f170 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
2f180 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
2f190 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
2f1a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2f1b0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2f1c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2f1d0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
2f1e0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
2f1f0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
2f200 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
2f210 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
2f220 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2f230 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
2f240 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
2f250 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
2f260 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
2f270 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
2f280 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
2f290 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
2f2a0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
2f2b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2f2c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
2f2d0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
2f2e0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
2f2f0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
2f300 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2f310 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
2f320 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
2f330 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
2f340 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
2f350 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2f360 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f370 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
2f380 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2f390 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
2f3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f3b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2f3c0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
2f3d0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
2f3e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f3f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2f400 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
2f410 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2f420 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
2f430 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2f440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f450 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
2f460 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
2f470 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f4a0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
2f4b0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f4d0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2f4e0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
2f4f0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
2f500 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f510 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f520 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2f530 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
2f540 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
2f550 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
2f560 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
2f570 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
2f580 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
2f590 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
2f5a0 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
2f5b0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
2f5c0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
2f5d0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2f5e0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
2f5f0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
2f600 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
2f610 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
2f620 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2f630 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2f640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2f650 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2f660 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
2f670 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
2f680 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2f690 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2f6a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2f6b0 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
2f6c0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
2f6d0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2f6e0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
2f6f0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
2f700 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
2f710 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
2f720 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
2f730 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
2f740 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
2f750 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
2f760 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
2f770 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
2f780 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2f790 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
2f7a0 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
2f7b0 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
2f7c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f7d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f7e0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
2f7f0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2f800 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2f810 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
2f820 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
2f830 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2f840 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2f850 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2f860 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
2f870 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2f880 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f890 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
2f8a0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
2f8b0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
2f8c0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2f8d0 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
2f8e0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
2f8f0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2f900 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
2f910 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2f920 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
2f930 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
2f940 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
2f950 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
2f960 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
2f970 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
2f980 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
2f990 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2f9a0 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
2f9b0 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
2f9c0 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
2f9d0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2f9e0 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
2f9f0 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
2fa00 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
2fa10 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2fa20 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2fa30 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
2fa40 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
2fa50 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2fa60 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
2fa70 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
2fa80 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
2fa90 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
2faa0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2fab0 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
2fac0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
2fad0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
2fae0 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
2faf0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2fb00 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2fb10 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
2fb20 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
2fb30 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
2fb40 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2fb50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2fb60 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2fb70 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
2fb80 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2fb90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fbb0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2fbc0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
2fbd0 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
2fbe0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2fbf0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2fc00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
2fc10 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
2fc20 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
2fc30 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2fc40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2fc50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2fc60 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
2fc70 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2fc80 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
2fc90 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
2fca0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
2fcb0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
2fcc0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
2fcd0 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
2fce0 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
2fcf0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
2fd00 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
2fd10 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
2fd20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2fd30 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
2fd40 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
2fd50 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
2fd60 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
2fd70 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
2fd80 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
2fd90 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
2fda0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
2fdb0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
2fdc0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
2fdd0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
2fde0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
2fdf0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
2fe00 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
2fe10 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
2fe20 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
2fe30 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
2fe40 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
2fe50 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
2fe60 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
2fe70 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
2fe80 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
2fe90 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
2fea0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
2feb0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
2fec0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
2fed0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
2fee0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
2fef0 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
2ff00 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
2ff10 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
2ff20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
2ff30 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
2ff40 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
2ff50 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
2ff60 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
2ff70 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
2ff80 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
2ff90 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
2ffa0 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
2ffb0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
2ffc0 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
2ffd0 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
2ffe0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
2fff0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
30000 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  8"..      **.   
30010 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
30020 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36  F: R-19920-11576
30030 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20   However, newer 
30040 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30050 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a  te still.      *
30060 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68  * avoid using th
30070 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69  e last six entri
30080 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69  es in the freeli
30090 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72  st trunk page ar
300a0 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ray in.      ** 
300b0 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62  order that datab
300c0 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65  ase files create
300d0 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
300e0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
300f0 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65  n be.      ** re
30100 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ad by older vers
30110 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a  ions of SQLite..
30120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
30130 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30140 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
30150 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
30160 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30170 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
30180 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30190 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
301a0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
301b0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
301c0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
301d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
301e0 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
301f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
30200 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
30210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30220 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
30230 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30240 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
30250 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30260 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
30270 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
30280 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
30290 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
302a0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
302b0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
302c0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
302d0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
302e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
302f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
30300 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
30310 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
30320 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
30330 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
30340 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
30350 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
30360 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
30370 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
30380 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
30390 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
303a0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
303b0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
303c0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
303d0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
303e0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
303f0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
30400 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
30410 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
30420 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
30430 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
30440 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
30450 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
30460 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
30470 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
30480 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
30490 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
304a0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
304b0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
304c0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
304d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
304e0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
304f0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
30500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
30510 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
30520 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
30530 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
30540 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
30550 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
30560 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
30570 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
30580 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
30590 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
305a0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
305b0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
305c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
305d0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
305e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
305f0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
30600 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
30610 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
30620 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30630 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
30640 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
30650 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
30660 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
30670 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
30680 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
30690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
306a0 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
306b0 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
306c0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
306d0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
306e0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
306f0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
30700 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
30710 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65  ven Cell.  Write
30720 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65   the.** local Ce
30730 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d  ll size (the num
30740 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20  ber of bytes on 
30750 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
30760 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f  e, omitting.** o
30770 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70  verflow) into *p
30780 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nSize..*/.static
30790 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a   int clearCell(.
307a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
307b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
307c0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
307d0 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f  ains the Cell */
307e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
307f0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46   *pCell,    /* F
30800 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
30810 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a   Cell */.  u16 *
30820 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
30830 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
30840 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c   size of the Cel
30850 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42  l here */.){.  B
30860 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
30870 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
30880 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
30890 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
308a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
308b0 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
308c0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
308d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
308e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
308f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74  ->mutex) );.  bt
30900 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
30910 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
30920 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20  nfo);.  *pnSize 
30930 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
30940 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
30950 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
30960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
30970 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
30980 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
30990 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
309a0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
309b0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
309c0 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
309d0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
309e0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
309f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30a00 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65  UPT_BKPT;  /* Ce
30a10 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
30a20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
30a30 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
30a40 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
30a50 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
30a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
30a70 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
30a80 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
30a90 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
30aa0 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
30ab0 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
30ac0 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
30ad0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
30ae0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
30af0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
30b00 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
30b10 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
30b20 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
30b30 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
30b40 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
30b50 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
30b60 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
30b70 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
30b80 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
30b90 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
30ba0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
30bb0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
30bc0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
30bd0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
30be0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
30bf0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
30c00 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
30c10 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
30c20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
30c30 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
30c40 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
30c50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30c60 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
30c70 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
30c80 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
30c90 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
30ca0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
30cb0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
30cc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30cd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
30ce0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
30cf0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
30d00 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
30d10 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
30d20 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
30d30 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
30d40 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
30d50 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
30d60 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
30d70 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
30d80 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
30d90 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30da0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
30db0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
30dc0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
30dd0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
30de0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
30df0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
30e00 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
30e10 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
30e20 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
30e30 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
30e40 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
30e50 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
30e60 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
30e70 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
30e80 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
30e90 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
30ea0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
30eb0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
30ec0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
30ed0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
30ee0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
30ef0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
30f00 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
30f10 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
30f20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
30f30 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
30f40 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
30f50 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
30f60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
30f70 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
30f80 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
30f90 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
30fa0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
30fb0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
30fc0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
30fd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31000 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
31010 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
31020 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
31030 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
31040 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
31050 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
31060 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
31070 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31080 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
31090 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
310a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
310b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
310c0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
310d0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
310e0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
310f0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
31100 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
31110 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
31120 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
31130 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
31140 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
31150 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
31160 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
31170 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
31180 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
31190 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
311a0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
311b0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
311c0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
311d0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
311e0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
311f0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
31200 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
31210 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
31220 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
31230 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
31240 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
31250 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
31260 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
31270 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
31280 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
31290 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
312a0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
312b0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
312c0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
312d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
312e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
312f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
31300 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
31310 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
31320 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
31330 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
31340 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
31350 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
31360 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
31370 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
31380 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
31390 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
313a0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
313b0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
313c0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
313d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
313e0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
313f0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
31400 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
31430 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
31440 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
31450 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
31460 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
31470 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
31480 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
31490 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
314a0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
314b0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
314c0 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
314d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
314e0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
314f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
31500 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
31510 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
31520 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
31530 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31540 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
31550 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
31560 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
31570 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
31580 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
31590 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
315a0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
315b0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
315c0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
315d0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
315e0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
315f0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
31600 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
31610 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
31620 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
31630 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
31640 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31650 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
31660 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
31670 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
31680 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
31690 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
316a0 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
316b0 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
316c0 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
316d0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
316e0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
316f0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
31700 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
31710 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
31720 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
31730 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
31740 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  t( nZero==0 );. 
31750 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
31760 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
31770 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
31780 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f  *)&nKey);.  .  /
31790 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
317a0 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20  yload size */.  
317b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
317c0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
317d0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
317e0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
317f0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
31800 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28   .    if( NEVER(
31810 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
31820 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20  || pKey==0) ){. 
31830 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31840 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31850 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
31860 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  oad = (int)nKey;
31870 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
31880 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
31890 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  t)nKey;.  }.  if
318a0 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
318b0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
318c0 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
318d0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
318e0 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
318f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
31900 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
31910 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
31920 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
31930 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61   spaceLeft = nPa
31940 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f  yload;.    pPrio
31950 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c  r = pCell;.  }el
31960 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d  se{.    int mn =
31970 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
31980 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  ;.    n = mn + (
31990 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
319a0 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
319b0 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
319c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
319d0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
319e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
319f0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
31a00 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
31a10 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
31a20 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
31a30 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
31a40 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
31a50 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
31a60 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70  .    pPrior = &p
31a70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
31a80 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20  .  }.  pPayload 
31a90 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
31aa0 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  ];..  /* At this
31ab0 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
31ac0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
31ad0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
31ae0 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
31af0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
31b00 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
31b10 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
31b20 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
31b30 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
31b40 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
31b50 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
31b60 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
31b70 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
31b80 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
31b90 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bb0 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
31bc0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
31bd0 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
31be0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
31bf0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
31c00 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
31c10 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
31c20 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
31c30 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
31c40 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
31c50 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
31c60 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
31c70 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
31c80 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
31c90 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
31ca0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
31cb0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
31cc0 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
31cd0 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
31ce0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
31cf0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  /.#if SQLITE_DEB
31d00 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
31d10 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74  nfo info;.    bt
31d20 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31d30 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
31d40 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
31d50 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28  ( nHeader=(int)(
31d60 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
31d70 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73  pCell) );.    as
31d80 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
31d90 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  =nKey );.    ass
31da0 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
31db0 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
31dc0 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
31dd0 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
31de0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
31df0 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65  ( pPrior == &pCe
31e00 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
31e10 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  w] );.  }.#endif
31e20 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
31e30 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
31e40 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
31e50 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
31e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
31e70 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  /.  while( nPayl
31e80 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
31e90 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
31ea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31eb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31ec0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
31ed0 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
31ee0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
31ef0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
31f00 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
31f10 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
31f20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
31f30 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
31f40 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
31f50 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
31f60 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
31f70 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
31f80 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
31f90 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31fa0 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
31fb0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
31fc0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
31fd0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
31fe0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
31ff0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
32000 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
32010 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32020 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
32030 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
32040 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
32050 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
32060 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
32070 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
32080 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
32090 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
320a0 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
320b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
320c0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
320d0 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
320e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
320f0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
32100 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
32110 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
32120 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
32130 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
32140 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
32150 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
32160 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
32170 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
32180 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
32190 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
321a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
321b0 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
321c0 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
321d0 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
321e0 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
321f0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
32200 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
32210 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
32220 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
32230 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
32240 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
32250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32260 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
32270 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
32280 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
32290 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
322a0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
322b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
322c0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
322d0 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
322e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
322f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
32300 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
32310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
32320 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
32330 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
32340 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
32350 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
32360 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
32370 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
32380 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
32390 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
323a0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
323b0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
323c0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
323d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
323e0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
323f0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
32400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
32410 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
32420 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32430 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
32440 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32450 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
32460 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
32470 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
32480 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
32490 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
324a0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
324b0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
324c0 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
324d0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
324e0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
324f0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
32500 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
32510 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
32520 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
32530 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
32540 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
32550 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
32560 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32570 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
32580 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
32590 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
325a0 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
325b0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
325c0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
325d0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
325e0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
325f0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
32600 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
32610 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
32620 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
32630 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
32640 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
32650 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
32660 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
32670 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
32680 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
32690 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
326a0 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
326b0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
326c0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
326d0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
326e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
326f0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
32700 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
32710 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
32720 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
32730 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
32740 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
32750 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
32760 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
32770 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
32780 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
32790 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
327a0 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
327b0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
327c0 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
327d0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
327e0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
327f0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
32800 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32810 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
32820 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
32830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
32840 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
32850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32860 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
32870 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
32880 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
32890 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
328a0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
328b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
328c0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
328d0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
328e0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
328f0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
32900 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
32910 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
32920 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
32930 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
32940 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
32950 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32960 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
32970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32980 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
32990 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
329a0 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
329b0 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
329c0 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
329d0 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
329e0 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
329f0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
32a00 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
32a10 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
32a20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
32a30 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
32a40 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
32a50 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
32a60 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
32a70 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
32a80 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
32a90 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
32aa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
32ab0 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
32ac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
32ad0 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
32ae0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
32af0 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
32b00 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
32b10 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
32b20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
32b30 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
32b40 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
32b50 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
32b60 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
32b70 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
32b80 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
32b90 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
32ba0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
32bb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
32bc0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
32bd0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
32be0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
32bf0 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
32c00 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
32c10 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
32c20 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
32c30 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
32c40 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
32c50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
32c60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
32c70 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
32c80 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
32c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32ca0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
32cb0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
32cc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32cd0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
32ce0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
32cf0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
32d00 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
32d10 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
32d20 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
32d30 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
32d40 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
32d50 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
32d60 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
32d70 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
32d80 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
32d90 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
32da0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
32db0 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
32dc0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
32dd0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
32de0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
32df0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
32e00 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
32e10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
32e20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
32e30 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
32e40 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
32e50 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
32e60 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
32e70 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
32e80 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
32e90 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
32ea0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
32eb0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
32ec0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
32ed0 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
32ee0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
32ef0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
32f00 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
32f10 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
32f20 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
32f30 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
32f40 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
32f60 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
32f70 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
32f80 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
32f90 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
32fa0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
32fb0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
32fc0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
32fd0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
32fe0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
32ff0 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
33000 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
33010 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
33020 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
33030 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
33040 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
33050 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
33060 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
33070 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
33080 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
33090 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
330a0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
330b0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
330c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
330d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
330e0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
330f0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
33100 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
33110 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
33120 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
33130 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
33140 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
33150 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
33160 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
33170 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
33180 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
33190 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
331a0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
331b0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
331c0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
331d0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
331e0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
331f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
33200 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73  ncremented..*/.s
33210 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
33220 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
33230 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
33240 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
33250 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
33260 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
33270 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
33280 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
33290 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
332a0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
332b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
332c0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
332d0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
332e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
332f0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
33300 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
33310 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
33320 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
33330 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
33340 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
33350 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
33360 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
33370 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
33380 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
33390 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
333a0 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
333b0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
333c0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
333d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
333e0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
333f0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
33400 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
33410 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
33420 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
33430 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33440 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
33450 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
33460 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
33470 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
33480 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
33490 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
334a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
334b0 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
334c0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
334d0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
334e0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
334f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
33500 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
33510 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
33520 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
33530 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
33540 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
33550 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  page */..  if( *
33560 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
33570 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
33580 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
33590 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
335a0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
335b0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
335c0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
335d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
335e0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
335f0 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
33600 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
33610 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
33620 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
33630 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
33640 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
33650 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
33660 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
33670 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
33680 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33690 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
336a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
336b0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
336c0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
336d0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
336e0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
336f0 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
33700 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
33710 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
33720 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
33730 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
33740 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
33750 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
33760 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
33770 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
33780 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
33790 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
337a0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
337b0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
337c0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
337d0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
337e0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
337f0 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
33800 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
33810 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
33820 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
33830 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
33840 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
33850 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
33860 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
33870 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
33880 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
33890 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
338a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
338b0 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
338c0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
338d0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
338e0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
338f0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
33900 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
33910 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
33920 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
33930 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
33940 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
33950 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
33960 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
33970 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
33980 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
33990 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
339a0 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
339b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
339c0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
339d0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
339e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
339f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33a00 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
33a10 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
33a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
33a30 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33a40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33a50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
33a60 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
33a70 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
33a80 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
33a90 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
33aa0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
33ab0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
33ac0 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
33ad0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
33ae0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
33af0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
33b00 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
33b10 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
33b20 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
33b30 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
33b40 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
33b50 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
33b60 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
33b70 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
33b80 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
33b90 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
33ba0 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
33bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
33bc0 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
33bd0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33be0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
33bf0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
33c00 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
33c10 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
33c20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
33c30 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  dx], pCell, sz);
33c40 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
33c50 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
33c60 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
33c70 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
33c80 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
33c90 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73  ns+2], &data[ins
33ca0 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20  ], end-ins);.   
33cb0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
33cc0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
33cd0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
33ce0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
33cf0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
33d00 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33d10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33d20 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
33d30 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
33d40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
33d50 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
33d60 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
33d70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
33d80 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
33d90 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
33da0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
33db0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
33dc0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
33dd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
33de0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
33df0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
33e00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
33e10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  }.}../*.** Array
33e20 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
33e30 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
33e40 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
33e50 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
33e60 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
33e70 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
33e80 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
33e90 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
33ea0 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
33eb0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
33ec0 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
33ed0 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
33ee0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
33ef0 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
33f00 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
33f10 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
33f20 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
33f30 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
33f40 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
33f50 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
33f60 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
33f70 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
33f80 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
33f90 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
33fa0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
33fb0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
33fc0 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
33fd0 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
33fe0 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
33ff0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
34000 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
34010 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
34020 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
34030 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
34040 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 62 75  static void rebu
34050 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ildPage(.  MemPa
34060 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
34070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
34080 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
34090 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
340a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340b0 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65    /* Final numbe
340c0 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61  r of cells on pa
340d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
340e0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
340f0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
34100 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
34110 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34130 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
34140 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  sizes */.){.  co
34150 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
34160 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  g->hdrOffset;   
34170 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
34180 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
34190 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  g */.  u8 * cons
341a0 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
341b0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
341c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
341d0 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  ta for pPg */.  
341e0 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65  const int usable
341f0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
34200 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75  >usableSize;.  u
34210 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
34220 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69   &aData[usableSi
34230 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ze];.  int i;.  
34240 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70  u8 *pCellptr = p
34250 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20  Pg->aCellIdx;.  
34260 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74  u8 *pTmp = sqlit
34270 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
34280 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65  (pPg->pBt->pPage
34290 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b  r);.  u8 *pData;
342a0 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  ..  i = get2byte
342b0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b  (&aData[hdr+5]);
342c0 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b  .  memcpy(&pTmp[
342d0 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75  i], &aData[i], u
342e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a  sableSize - i);.
342f0 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b  .  pData = pEnd;
34300 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
34310 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
34320 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c  8 *pCell = apCel
34330 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
34340 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65  ell>aData && pCe
34350 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
34360 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
34370 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
34380 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d     }.    pData -
34390 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
343a0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
343b0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
343c0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
343d0 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
343e0 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
343f0 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
34400 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c    assert( szCell
34410 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  [i]==cellSizePtr
34420 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  (pPg, pCell) || 
34430 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
34440 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65    testcase( szCe
34450 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50  ll[i]==cellSizeP
34460 74 72 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b  tr(pPg,pCell) );
34470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
34480 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
34490 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
344a0 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
344b0 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
344c0 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
344d0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
344e0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
344f0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
34500 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
34510 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
34520 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
34530 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
34540 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
34550 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
34560 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
34570 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  0x00;.}../*.** A
34580 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
34590 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
345a0 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
345b0 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
345c0 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ell.** contains 
345d0 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
345e0 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
345f0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
34600 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a  on attempts to .
34610 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73  ** add the cells
34620 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
34630 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67  rray to page pPg
34640 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28  . If it cannot (
34650 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  because .** the 
34660 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
34670 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
34680 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77  fore the cells w
34690 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65  ill fit), non-ze
346a0 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ro.** is returne
346b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
346c0 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61   the cells are a
346d0 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
346e0 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65  y, zero is.** re
346f0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  turned..**.** Ar
34700 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20  gument pCellptr 
34710 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
34720 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
34730 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
34740 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ray.** (part of 
34750 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70  page pPg) to pop
34760 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c  ulate. After cel
34770 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77  l apCell[0] is w
34780 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
34790 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36   page body, a 16
347a0 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77  -bit offset is w
347b0 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70  ritten to pCellp
347c0 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66  tr. And so on, f
347d0 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20  or each.** cell 
347e0 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74  in the array. It
347f0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
34800 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
34810 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a  ller to ensure.*
34820 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  * that it is saf
34830 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74  e to overwrite t
34840 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
34850 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
34860 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ay..**.** When t
34870 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34880 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20  called, *ppData 
34890 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
348a0 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  art of the .** c
348b0 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70  ontent area on p
348c0 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20  age pPg. If the 
348d0 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  size of the cont
348e0 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65  ent area is exte
348f0 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61  nded,.** *ppData
34900 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 70   is updated to p
34910 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
34920 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e  start of the con
34930 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66  tent area.** bef
34940 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
34950 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72  *.** Finally, ar
34960 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f  gument pBegin po
34970 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74 65  ints to the byte
34980 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
34990 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e  lowing the.** en
349a0 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20 72  d of the space r
349b0 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20  equired by this 
349c0 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c  page for the cel
349d0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28  l-pointer area (
349e0 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73  for.** all cells
349f0 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73   - not just thos
34a00 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  e inserted by th
34a10 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e  e current call).
34a20 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a   If the content.
34a30 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65 20  ** area must be 
34a40 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f  extended to befo
34a50 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  re this point in
34a60 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f   order to accomo
34a70 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c  date all.** cell
34a80 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74  s in apCell[], t
34a90 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f  hen the cells do
34aa0 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e   not fit and non
34ab0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
34ac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
34ad0 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
34ae0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
34af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34b00 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61      /* Page to a
34b10 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20  dd cells to */. 
34b20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20   u8 *pBegin,    
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b40 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d   /* End of cell-
34b50 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
34b60 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20  .  u8 **ppData, 
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b80 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61     /* IN/OUT: Pa
34b90 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61  ge content -area
34ba0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
34bb0 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20   *pCellptr,     
34bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34bd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
34be0 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f  -pointer area */
34bf0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34c20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
34c30 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  pPg */.  u8 **ap
34c40 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
34c50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
34c60 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
34c70 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
34c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c90 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
34ca0 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   sizes */.){.  i
34cb0 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74  nt i;.  u8 *aDat
34cc0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
34cd0 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70    u8 *pData = *p
34ce0 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69  pData;.  const i
34cf0 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20 61  nt bFreelist = a
34d00 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61  Data[1] || aData
34d10 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 43  [2];.  assert( C
34d20 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67  ORRUPT_DB || pPg
34d30 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
34d40 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  ;    /* Never ca
34d50 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a  lled on page 1 *
34d60 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
34d70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
34d80 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b  int sz = szCell[
34d90 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  i];.    int rc;.
34da0 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20      u8 *pSlot;. 
34db0 20 20 20 69 66 28 20 62 46 72 65 65 6c 69 73 74     if( bFreelist
34dc0 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20  ==0 || (pSlot = 
34dd0 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67  pageFindSlot(pPg
34de0 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d  , sz, &rc, 0))==
34df0 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  0 ){.      pData
34e00 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66   -= sz;.      if
34e10 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29  ( pData<pBegin )
34e20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
34e30 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a   pSlot = pData;.
34e40 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
34e50 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69  (pSlot, apCell[i
34e60 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32  ], sz);.    put2
34e70 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
34e80 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b  pSlot - aData));
34e90 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
34ea0 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74   2;.  }.  *ppDat
34eb0 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74  a = pData;.  ret
34ec0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
34ed0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
34ee0 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
34ef0 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
34f00 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
34f10 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  Cell .** contain
34f20 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
34f30 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
34f40 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
34f50 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a  tion adds the.**
34f60 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65   space associate
34f70 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c  d with each cell
34f80 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68   in the array th
34f90 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
34fa0 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69  stored .** withi
34fb0 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50  n the body of pP
34fc0 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65  g to the pPg fre
34fd0 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c  e-list. The cell
34fe0 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74  -pointers and ot
34ff0 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66  her.** fields of
35000 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f   the page are no
35010 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  t updated..**.**
35020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
35030 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
35040 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
35050 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
35060 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ee-list..*/.stat
35070 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41  ic int pageFreeA
35080 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
35090 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
350a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
350b0 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74  to edit */.  int
350c0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
350e0 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20  Cells to delete 
350f0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
35100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35110 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
35120 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
35130 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
35140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35150 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
35160 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  es */.){.  u8 * 
35170 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
35180 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
35190 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
351a0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
351b0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
351c0 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
351d0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
351e0 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
351f0 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
35200 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
35210 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
35220 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e  *pFree = 0;.  in
35230 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20  t szFree = 0;.. 
35240 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
35250 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
35260 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
35270 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
35280 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43 65  l>=pStart && pCe
35290 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
352a0 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c   int sz = szCell
352b0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
352c0 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73  Free!=(pCell + s
352d0 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z) ){.        if
352e0 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
352f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
35300 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
35310 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
35320 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  6 );.          f
35330 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
35340 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
35350 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20  a), szFree);.   
35360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
35370 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
35380 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
35390 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  z;.        if( p
353a0 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72  Free+sz>pEnd ) r
353b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
353c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
353d0 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
353e0 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73       szFree += s
353f0 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
35400 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRet++;.    }. 
35410 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29   }.  if( pFree )
35420 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
35430 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
35440 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
35450 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70  36 );.    freeSp
35460 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
35470 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
35480 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zFree);.  }.  re
35490 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn nRet;.}../*
354a0 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64  .** apCell[] and
354b0 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   szCell[] contai
354c0 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
354d0 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  nd sizes of all 
354e0 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cells in the.** 
354f0 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
35500 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65  nced.  The curre
35510 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61  nt page, pPg, ha
35520 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c  s pPg->nCell cel
35530 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77  ls starting.** w
35540 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d  ith apCell[iOld]
35550 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69  .  After balanci
35560 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68  ng, this page sh
35570 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63  ould hold nNew c
35580 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67  ells.** starting
35590 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d   at apCell[iNew]
355a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
355b0 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e  tine makes the n
355c0 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
355d0 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74  ents to pPg so t
355e0 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  hat it contains.
355f0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ** the correct c
35600 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67  ells after being
35610 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a   balanced..**.**
35620 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
35630 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
35640 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35650 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20  ion returns. It 
35660 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e  is the.** respon
35670 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
35680 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
35690 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
356a0 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 50  tatic void editP
356b0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
356c0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
356d0 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
356e0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
356f0 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  t iOld,         
35700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35710 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
35720 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f  cell currently o
35730 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
35740 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  iNew,           
35750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35760 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73  ndex of new firs
35770 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a  t cell on page *
35780 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20  /.  int nNew,   
35790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357a0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
357b0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
357c0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
357d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
357e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
357f0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
35800 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
35810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35820 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
35830 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35840 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
35850 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
35860 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
35870 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
35880 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20  .  u8 *pBegin = 
35890 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  &pPg->aCellIdx[n
358a0 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20  New * 2];.  int 
358b0 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65  nCell = pPg->nCe
358c0 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  ll;       /* Cel
358d0 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67  ls stored on pPg
358e0 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b   */.  u8 *pData;
358f0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
35900 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
35910 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b  iOldEnd = iOld +
35920 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50   pPg->nCell + pP
35930 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  g->nOverflow;.  
35940 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e  int iNewEnd = iN
35950 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  ew + nNew;..#ifd
35960 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35970 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
35980 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
35990 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
359a0 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  ger);.  memcpy(p
359b0 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d  Tmp, aData, pPg-
359c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
359d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
359e0 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f  Remove cells fro
359f0 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  m the start and 
35a00 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
35a10 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e  */.  if( iOld<iN
35a20 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ew ){.    int nS
35a30 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41  hift = pageFreeA
35a40 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35a50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61  g, iNew-iOld, &a
35a60 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a  pCell[iOld], &sz
35a70 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29  Cell[iOld].    )
35a80 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50  ;.    memmove(pP
35a90 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50  g->aCellIdx, &pP
35aa0 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69  g->aCellIdx[nShi
35ab0 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b  ft*2], nCell*2);
35ac0 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53  .    nCell -= nS
35ad0 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hift;.  }.  if( 
35ae0 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e  iNewEnd < iOldEn
35af0 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  d ){.    nCell -
35b00 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
35b10 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4f  .        pPg, iO
35b20 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26  ldEnd-iNewEnd, &
35b30 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c  apCell[iNewEnd],
35b40 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64   &szCell[iNewEnd
35b50 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ].    );.  }..  
35b60 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b 67  pData = &aData[g
35b70 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
35b80 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a  aData[hdr+5])];.
35b90 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67    if( pData<pBeg
35ba0 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61  in ) goto editpa
35bb0 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41  ge_fail;..  /* A
35bc0 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20  dd cells to the 
35bd0 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
35be0 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c  e */.  if( iNew<
35bf0 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  iOld ){.    int 
35c00 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nAdd = MIN(nNew,
35c10 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20  iOld-iNew);.    
35c20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e  assert( (iOld-iN
35c30 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c  ew)<nNew || nCel
35c40 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  l==0 || CORRUPT_
35c50 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  DB );.    pCellp
35c60 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
35c70 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  dx;.    memmove(
35c80 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32  &pCellptr[nAdd*2
35c90 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65  ], pCellptr, nCe
35ca0 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70  ll*2);.    if( p
35cb0 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35cc0 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70            pPg, p
35cd0 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
35ce0 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
35cf0 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c     nAdd, &apCell
35d00 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iNew], &szCell[
35d10 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f  iNew].    ) ) go
35d20 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
35d30 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e  ;.    nCell += n
35d40 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  Add;.  }..  /* A
35d50 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  dd any overflow 
35d60 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69  cells */.  for(i
35d70 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72  =0; i<pPg->nOver
35d80 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  flow; i++){.    
35d90 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c  int iCell = (iOl
35da0 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b  d + pPg->aiOvfl[
35db0 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20  i]) - iNew;.    
35dc0 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20  if( iCell>=0 && 
35dd0 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20  iCell<nNew ){.  
35de0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26      pCellptr = &
35df0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43  pPg->aCellIdx[iC
35e00 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20  ell * 2];.      
35e10 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74  memmove(&pCellpt
35e20 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20  r[2], pCellptr, 
35e30 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20  (nCell - iCell) 
35e40 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c  * 2);.      nCel
35e50 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l++;.      if( p
35e60 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35e70 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2c              pPg,
35e80 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
35e90 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
35ea0 20 20 20 20 20 20 20 31 2c 20 26 61 70 43 65 6c         1, &apCel
35eb0 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c  l[iCell + iNew],
35ec0 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b   &szCell[iCell +
35ed0 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20 29   iNew].      ) )
35ee0 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
35ef0 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ail;.    }.  }..
35f00 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c    /* Append cell
35f10 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
35f20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43  the page */.  pC
35f30 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61  ellptr = &pPg->a
35f40 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
35f50 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73 65  ;.  if( pageInse
35f60 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  rtArray(.       
35f70 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
35f80 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
35f90 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65          nNew-nCe
35fa0 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77  ll, &apCell[iNew
35fb0 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c  +nCell], &szCell
35fc0 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29  [iNew+nCell].  )
35fd0 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35fe0 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e  _fail;..  pPg->n
35ff0 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  Cell = nNew;.  p
36000 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
36010 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
36020 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
36030 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
36040 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
36050 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
36060 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ta);..#ifdef SQL
36070 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
36080 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21  i=0; i<nNew && !
36090 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29  CORRUPT_DB; i++)
360a0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
360b0 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d  = apCell[i+iNew]
360c0 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  ;.    int iOff =
360d0 20 67 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e   get2byte(&pPg->
360e0 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a  aCellIdx[i*2]);.
360f0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61      if( pCell>=a
36100 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61  Data && pCell<&a
36110 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
36120 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
36130 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
36140 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
36150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
36160 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43  rt( 0==memcmp(pC
36170 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66  ell, &aData[iOff
36180 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77  ], szCell[i+iNew
36190 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ]) );.  }.#endif
361a0 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64 69  ..  return;. edi
361b0 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a  tpage_fail:.  /*
361c0 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74 20   Unable to edit 
361d0 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75 69  this page. Rebui
361e0 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61 74  ld it from scrat
361f0 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20  ch instead. */. 
36200 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50 67   rebuildPage(pPg
36210 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b  , nNew, &apCell[
36220 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iNew], &szCell[i
36230 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  New]);.}../*.** 
36240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
36250 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
36260 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
36270 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
36280 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
36290 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
362a0 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
362b0 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
362c0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
362d0 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
362e0 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
362f0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
36300 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
36310 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
36320 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
36330 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
36340 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
36350 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
36360 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
36370 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
36380 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
36390 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
363a0 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
363b0 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
363c0 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
363d0 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
363e0 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
363f0 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
36400 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
36410 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
36420 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
36430 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
36440 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
36450 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
36460 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
36470 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
36480 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
36490 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
364a0 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
364b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
364c0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
364d0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
364e0 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
364f0 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
36500 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
36510 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
36520 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23  e balance */...#
36530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36540 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
36550 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
36560 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
36570 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
36580 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
36590 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
365a0 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
365b0 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
365c0 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
365d0 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
365e0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
365f0 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
36600 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
36610 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
36620 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
36630 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
36640 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61  f trying to bala
36650 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
36660 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
36670 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
36680 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
36690 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
366a0 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
366b0 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
366c0 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
366d0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
366e0 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
366f0 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
36700 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
36710 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
36720 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
36730 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
36740 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
36750 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
36760 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
36770 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
36780 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
36790 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
367a0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
367b0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
367c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
367d0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
367e0 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
367f0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
36800 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
36810 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
36820 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
36830 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
36840 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
36850 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
36860 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36870 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
36880 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
36890 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
368a0 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
368b0 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
368c0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
368d0 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
368e0 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
368f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
36900 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
36910 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
36920 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
36930 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
36940 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
36950 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36960 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
36970 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
36980 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
36990 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
369a0 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
369b0 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
369c0 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
369d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
369e0 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
369f0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
36a00 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
36a10 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
36a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a30 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
36a40 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
36a50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
36a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36a80 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
36a90 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
36aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ab0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36ac0 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
36ad0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
36ae0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
36af0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
36b00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36b10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36b20 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
36b30 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
36b40 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36b50 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ==1 );..  /* Thi
36b60 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  s error conditio
36b70 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  n is now caught 
36b80 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
36b90 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
36ba0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
36bb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  Page->nCell==0) 
36bc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
36bd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
36be0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
36bf0 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
36c00 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
36c10 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
36c20 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
36c30 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
36c40 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
36c50 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
36c60 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
36c70 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
36c80 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
36c90 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
36ca0 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
36cb0 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
36cc0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
36cd0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
36ce0 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
36cf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36d00 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
36d10 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
36d20 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
36d30 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  l = pPage->apOvf
36d40 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a  l[0];.    u16 sz
36d50 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
36d60 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
36d70 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
36d80 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
36d90 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36da0 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
36db0 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
36dc0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
36dd0 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
36de0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
36df0 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
36e00 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
36e10 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
36e20 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
36e30 0a 20 20 20 20 72 65 62 75 69 6c 64 50 61 67 65  .    rebuildPage
36e40 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
36e50 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  , &szCell);.    
36e60 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42  pNew->nFree = pB
36e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36e80 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pNew->cellOffset
36e90 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a   - 2 - szCell;..
36ea0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
36eb0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
36ec0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
36ed0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
36ee0 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
36ef0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
36f00 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
36f10 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
36f20 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
36f30 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
36f40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
36f50 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
36f60 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
36f70 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
36f80 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
36f90 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
36fa0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
36fb0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
36fc0 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
36fd0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
36fe0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
36ff0 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
37000 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
37010 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
37020 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
37030 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
37040 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
37050 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
37060 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
37070 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
37080 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
37090 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
370a0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
370b0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
370c0 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
370d0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
370e0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
370f0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
37100 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
37110 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
37120 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
37130 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
37140 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
37150 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
37160 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
37170 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
37180 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
37190 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
371a0 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
371b0 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
371c0 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
371d0 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
371e0 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
371f0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
37200 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
37210 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
37220 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
37230 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
37240 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
37250 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
37260 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
37270 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
37280 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
37290 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
372a0 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
372b0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
372c0 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
372d0 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
372e0 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
372f0 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
37300 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
37310 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
37320 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
37330 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
37340 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
37350 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
37360 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
37370 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
37380 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
37390 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
373a0 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
373b0 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
373c0 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
373d0 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
373e0 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
373f0 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
37400 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
37410 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
37420 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
37430 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
37440 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
37450 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37460 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
37470 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
37480 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
37490 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
374a0 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
374b0 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
374c0 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
374d0 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
374e0 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
374f0 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
37500 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
37510 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
37520 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
37530 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
37540 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
37550 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
37560 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
37570 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
37580 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
37590 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
375a0 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
375b0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
375c0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
375d0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
375e0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
375f0 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
37600 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
37610 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
37620 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
37630 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
37640 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
37650 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
37660 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
37670 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
37680 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
37690 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
376a0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
376b0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
376c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
376d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
376e0 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
376f0 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
37700 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
37710 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
37720 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
37730 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
37740 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
37750 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
37760 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
37770 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
37780 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
37790 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
377a0 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
377b0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
377c0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
377d0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
377e0 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
377f0 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
37800 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
37810 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
37820 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
37830 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
37840 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
37850 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
37860 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
37870 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
37880 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
37890 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
378a0 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
378b0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
378c0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
378d0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
378e0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
378f0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
37900 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
37910 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
37920 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
37930 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
37940 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
37950 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
37960 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
37970 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
37980 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
37990 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
379a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
379b0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
379c0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
379d0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
379e0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
379f0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
37a00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
37a10 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
37a20 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
37a30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37a40 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
37a50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
37a60 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
37a70 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
37a80 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
37a90 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
37aa0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
37ab0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
37ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
37ad0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
37ae0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
37af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
37b00 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
37b10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
37b20 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
37b30 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
37b40 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
37b50 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
37b60 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
37b70 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
37b80 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
37b90 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
37ba0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
37bb0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
37bc0 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
37bd0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
37be0 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
37bf0 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
37c00 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
37c10 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
37c20 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
37c30 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
37c40 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
37c50 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
37c60 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
37c70 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
37c80 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
37c90 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
37ca0 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
37cb0 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
37cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
37cd0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
37ce0 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
37cf0 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
37d00 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
37d10 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72  Page.apOvfl[] ar
37d20 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
37d30 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
37d40 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
37d50 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
37d60 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
37d70 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
37d80 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
37d90 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
37da0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
37db0 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
37dc0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
37dd0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
37de0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
37df0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
37e00 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
37e10 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
37e20 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
37e30 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
37e40 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
37e50 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
37e60 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
37e70 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
37e80 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
37e90 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
37ea0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
37eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
37ec0 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
37ed0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
37ee0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
37ef0 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
37f00 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
37f10 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
37f20 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
37f30 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
37f40 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
37f50 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
37f60 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
37f70 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
37f80 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
37f90 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
37fa0 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
37fb0 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
37fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
37fd0 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
37fe0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
37ff0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
38000 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
38010 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
38020 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
38030 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
38040 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
38050 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
38060 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
38070 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
38080 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
38090 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
380a0 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
380b0 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
380c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
380d0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
380e0 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
380f0 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
38100 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
38110 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
38120 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
38130 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
38140 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
38150 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
38160 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
38170 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
38180 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
38190 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
381a0 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
381b0 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
381c0 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
381d0 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
381e0 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
381f0 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
38200 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
38210 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
38220 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
38230 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
38240 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
38250 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
38260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
38280 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
38290 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
382a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
382b0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
382c0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
382d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
382e0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
382f0 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
38300 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
38310 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
38320 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
38330 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
38340 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
38350 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
38360 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
38370 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
38380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
38390 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
383a0 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
383b0 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
383c0 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
383d0 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
383e0 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
383f0 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
38400 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
38410 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
38420 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
38430 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
38440 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
38450 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
38460 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
38470 0a 2a 2a 20 70 61 67 65 20 61 72 65 2