/ Hex Artifact Content
Login

Artifact 2a1245df0356a229bcd0fd87a8536b5067f16e82:


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 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5000: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5010: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5020: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5030: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5040: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5050: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5060: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5070: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5080: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5090: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
50a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
5100: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5110: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5120: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5130: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5140: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5150: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5160: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5170: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5180: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5190: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
51a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51d0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51e0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51f0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
5200: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5210: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5220: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5240: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5250: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5260: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5270: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5280: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5290: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
52a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52c0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
5300: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5310: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5320: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5330: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5350: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5360: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5370: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5380: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5390: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
53a0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53b0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53d0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53e0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53f0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
5400: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5410: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5420: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5430: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5440: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5450: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5460: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5470: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5480: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5490: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
54a0: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54b0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54c0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54d0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54e0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54f0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
5500: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5510: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5520: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5530: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5540: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5550: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5560: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5570: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5580: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5590: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
55a0: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55b0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55c0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55d0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55e0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
5600: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5610: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5620: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5630: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5640: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5650: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5660: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5670: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5680: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5690: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
56a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56b0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56d0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56e0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56f0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
5700: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5710: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5720: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5730: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5740: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5750: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5760: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5770: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5780: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5790: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
57a0: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57c0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57d0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57e0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5800: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5810: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5820: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5830: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5840: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5850: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5860: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5870: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5880: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5890: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
58a0: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58b0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58c0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58e0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58f0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
5900: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5910: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5920: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5930: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5940: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5950: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5960: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5970: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5980: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5990: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
59a0: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59b0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59c0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59d0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59e0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59f0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
5a00: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a10: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a20: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a30: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a40: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a50: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a70: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a80: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a90: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5aa0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5ab0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ac0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ae0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b00: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b10: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b20: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b30: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b50: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b60: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5ba0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5bb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bc0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bd0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5be0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5bf0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5c00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c10: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c20: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c30: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c40: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c60: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c70: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c80: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c90: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5ca0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5cb0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cc0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cd0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5ce0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5cf0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5d00: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d10: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d20: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d30: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d40: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d50: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d60: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d70: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d80: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d90: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5da0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5db0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5dc0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dd0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5de0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5df0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5e00: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e20: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e30: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e40: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e50: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e60: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5ea0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5eb0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5ec0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ed0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ee0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5f00: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f10: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f20: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f30: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f40: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f50: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f60: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f70: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f80: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f90: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5fa0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fb0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fc0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fd0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fe0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5ff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6000: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6010: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6020: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6030: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6040: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6050: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6060: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6070: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6080: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6090: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
60a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60d0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60f0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6100: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6110: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6120: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6140: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6150: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6180: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6190: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
61a0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61b0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61c0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61e0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61f0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6200: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6210: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6220: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6230: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6240: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6250: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6260: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6270: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6280: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6290: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
62a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62c0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62d0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62f0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
6300: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6310: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6320: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6330: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6340: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6350: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6360: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6370: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6380: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6390: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
63a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63b0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63c0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63d0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63e0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6410: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6420: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6430: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6440: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6450: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6460: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6470: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6480: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6490: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
64a0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64b0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64c0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64d0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
6500: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6510: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6520: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6530: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6540: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6550: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6560: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6570: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6580: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6590: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
65a0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65b0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65c0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65d0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65e0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65f0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
6600: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6610: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6620: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6630: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6640: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6650: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6660: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6670: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6680: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6690: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
66a0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66b0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66c0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66d0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66e0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66f0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
6700: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6710: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6720: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6730: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6740: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6750: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6760: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6770: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6790: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
67a0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67c0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
67d0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
67e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
67f0: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
6800: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6810: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6820: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6830: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6840: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6850: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6860: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6870: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
6880: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
6890: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
68a0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
68b0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
68c0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
68d0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
68e0: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
68f0: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
6900: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6910: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6920: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6930: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6940: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6950: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6960: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6970: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
6980: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
6990: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
69a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
69b0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
69c0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
69d0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
69e0: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
69f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6a00: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6a20: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6a30: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6a40: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6a50: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6a70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6a80: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6a90: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
6aa0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6ab0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6ac0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6ad0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6ae0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6af0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6b00: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6b10: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6b20: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6b30: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6b40: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6b60: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6b90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ba0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6bb0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6bc0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6bd0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6be0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6bf0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6c00: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6c10: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6c20: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6c30: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6c40: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6c50: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6c60: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6c70: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6c80: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6c90: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6ca0: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6cb0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6cc0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6cd0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6ce0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6cf0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6d00: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6d10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6d20: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6d30: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d40: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6d50: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d70: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6d80: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6d90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6da0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6db0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6dc0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6dd0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6de0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6df0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6e00: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6e10: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6e20: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6e30: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6e40: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6e50: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6e60: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6e70: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6e80: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e90: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6ea0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6eb0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6ec0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6ed0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6ee0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6ef0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6f00: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6f10: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6f20: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6f30: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6f40: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6f50: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6f60: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6f70: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6f80: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6f90: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6fa0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6fb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6fc0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6fd0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6fe0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6ff0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
7000: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7010: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7020: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7030: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7050: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7060: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7070: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7080: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7090: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
70a0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
70b0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
70c0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
70d0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
70e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
70f0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7100: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7110: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7120: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7130: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7140: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7150: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7160: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7170: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7180: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7190: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
71a0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
71b0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
71c0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
71d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
71e0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
71f0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7200: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7210: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7220: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7230: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7240: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7250: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7260: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7270: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7280: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
72a0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
72b0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
72c0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
72d0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
72e0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
72f0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7300: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7310: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7320: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7330: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7340: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7350: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7360: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7370: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7380: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7390: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
73a0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
73b0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
73c0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73d0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
73e0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
73f0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7400: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7410: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7420: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7430: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7440: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7460: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7470: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7480: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7490: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
74a0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
74b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
74c0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
74d0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
74e0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
74f0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7500: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7510: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7520: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7530: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7540: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7550: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7560: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7570: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7580: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7590: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
75a0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
75b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
75c0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
75d0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
75e0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
75f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7600: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7610: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7620: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7630: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7640: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7650: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7660: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7670: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7680: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7690: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
76a0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
76b0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
76c0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
76d0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
76e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
76f0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
7700: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7710: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7730: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7740: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7750: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7760: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7770: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7780: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7790: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
77a0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
77b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
77c0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
77d0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
77e0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
77f0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7800: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7810: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7820: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7830: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7840: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7870: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7880: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7890: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
78a0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
78b0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
78c0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
78d0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
78e0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
78f0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7900: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7910: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7920: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7930: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7940: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7950: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7960: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7970: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
7980: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
7990: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
79a0: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
79b0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
79c0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
79d0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
79e0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
79f0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7a00: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7a10: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7a20: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7a30: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7a40: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7a50: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7a60: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7a70: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
7a80: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
7a90: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
7aa0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7ab0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
7ac0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ad0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ae0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7af0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7b00: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7b10: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7b20: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7b30: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7b40: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7b50: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7b60: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7b70: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7b80: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7b90: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7ba0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7bb0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7bc0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7bd0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7be0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7bf0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7c00: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7c10: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7c20: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7c30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7c40: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7c50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7c70: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7c80: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7c90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7ca0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7cb0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7cc0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7cd0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7ce0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7cf0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7d00: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7d10: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7d20: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7d40: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7d50: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7d60: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7d70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7d80: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7d90: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7da0: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7db0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7dc0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7dd0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7de0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7df0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7e00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e10: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7e20: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7e30: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7e40: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7e50: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7e60: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7e80: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7e90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7ea0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7eb0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7ec0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7ed0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7ee0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7ef0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7f00: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7f10: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7f20: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7f30: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7f40: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7f50: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7f60: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7f70: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7f80: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7fa0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7fb0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fd0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fe0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7ff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
8000: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
8010: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
8020: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8030: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
8040: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8050: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
8060: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
8070: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
8080: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8090: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
80a0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
80b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
80c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
80d0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
80e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8100: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8110: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8120: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8130: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8140: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8150: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8160: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8170: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
8180: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8190: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
81a0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
81b0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
81c0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
81d0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
81e0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
81f0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8200: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8210: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8230: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8240: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8250: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8260: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8270: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8280: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8290: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
82a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
82b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
82c0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
82d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
82e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82f0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
8300: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8310: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8320: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8330: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8340: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8350: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8360: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8370: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
8380: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
8390: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
83a0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
83b0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
83c0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
83d0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
83e0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
83f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8400: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8410: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8420: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8430: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8440: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8450: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8460: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8470: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8480: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8490: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
84a0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
84b0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
84c0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
84d0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
84e0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
84f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8500: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8510: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8520: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8530: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8540: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8550: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8560: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8570: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8580: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8590: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
85a0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
85b0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
85c0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
85d0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
85e0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
85f0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8600: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8610: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8620: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8630: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8640: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8650: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8660: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8670: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8680: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8690: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
86a0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
86b0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
86c0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
86d0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
86e0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
86f0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8700: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8710: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8720: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8730: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8740: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8750: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8760: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8770: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
8780: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8790: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
87a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
87b0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
87c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87d0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
87e0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
87f0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
8800: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8810: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8820: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8830: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8840: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8850: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8860: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8870: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8880: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8890: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
88a0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
88b0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
88c0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88e0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
88f0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
8900: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8910: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8920: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8930: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8940: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8950: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8960: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8970: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
8980: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
8990: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
89a0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
89b0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
89c0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
89d0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
89e0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
89f0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
8a00: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8a10: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8a20: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8a30: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8a40: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8a50: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8a60: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8a70: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a80: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
8a90: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8aa0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
8ab0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
8ac0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
8ad0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8ae0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8af0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b20: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8b30: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8b40: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8b70: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8b80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8b90: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8ba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8bb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8bc0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8bd0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8be0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8bf0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8c00: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8c10: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8c20: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8c30: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8c40: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8c50: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8c60: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8c70: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8c80: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8c90: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8ca0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8cb0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8cc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8cd0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8ce0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8cf0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8d00: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8d10: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8d20: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8d30: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8d40: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d60: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8d70: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8d80: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8d90: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8da0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8db0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8dc0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8dd0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8de0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8df0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8e00: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8e10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8e20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8e30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8e40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8e60: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8e70: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8e80: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8e90: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8ea0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8eb0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8ec0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8ee0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8ef0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8f00: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8f10: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8f20: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8f30: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8f40: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8f50: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8f60: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f70: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8f80: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8f90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8fa0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8fb0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8fc0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8fd0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8fe0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8ff0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
9000: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9010: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9020: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9030: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9040: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9050: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9060: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9070: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9080: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9090: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
90a0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90b0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90c0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
90d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
90f0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9100: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9110: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9120: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9130: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9140: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9150: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9160: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9170: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
9180: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
9190: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
91a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
91b0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
91c0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
91d0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
91e0: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
91f0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9200: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9210: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9220: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9230: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9240: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9250: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9260: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9270: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9290: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
92a0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
92b0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
92c0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
92d0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
92e0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
92f0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
9300: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9310: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9320: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9330: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9340: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9350: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9360: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9370: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
9380: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
9390: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
93a0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
93b0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
93c0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
93d0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
93e0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
93f0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
9400: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9410: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9420: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9430: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9440: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9450: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9460: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9470: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9480: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9490: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
94a0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
94b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
94c0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
94d0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
94e0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
94f0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9500: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9510: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9520: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9530: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9540: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9550: 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20  ent area..**.** 
9560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9570: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
9580: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
9590: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
95a0: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
95b0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
95c0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
95d0: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
95e0: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
95f0: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
9600: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
9610: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
9620: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
9630: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
9640: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
9650: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9660: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
9670: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
9680: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9690: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
96c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
96f0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
9700: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9720: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
9730: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
9740: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9760: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
9770: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9790: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
97a0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
97b0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
97c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
97d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
97e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
97f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
9800: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9810: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
9820: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9830: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9840: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
9850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9860: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
9870: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
9880: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
9890: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
98a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
98b0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
98c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
98d0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
98e0: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
98f0: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
9900: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
9910: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
9920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
9930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9940: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9950: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
9960: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
9970: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
9980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
9990: 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72  dex */...  asser
99a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
99b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
99c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
99d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
99e0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
99f0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
9a00: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
9a10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
9a20: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9a30: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
9a40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9a60: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9a70: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
9a80: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
9a90: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9aa0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
9ab0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
9ac0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
9ad0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
9ae0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
9af0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
9b00: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
9b10: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
9b20: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
9b30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9b40: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
9b50: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
9b60: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
9b70: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
9b80: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
9b90: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
9ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
9bb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
9bc0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
9bd0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
9be0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
9bf0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
9c00: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
9c10: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9c20: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
9c30: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
9c40: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
9c50: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
9c60: 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66 69  ast );.#if !defi
9c70: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c80: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c90: 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68  CHECK).    /* Th
9ca0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
9cb0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
9cc0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
9cd0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
9ce0: 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e   ** if SQLITE_EN
9cf0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9d00: 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69  LL_CHECK is defi
9d10: 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned .    */.    
9d20: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
9d30: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
9d40: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
9d50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d60: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
9d70: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9d80: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
9d90: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
9da0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
9db0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9dc0: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
9dd0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69  cbrk -= size;.#i
9de0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9df0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9e00: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
9e10: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
9e20: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  irst ){.      re
9e30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9e40: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9e50: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62  #else.    if( cb
9e60: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
9e70: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
9e80: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
9e90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9ea0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9eb0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9ec0: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
9ed0: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
9ee0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9ef0: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
9f00: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
9f10: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
9f20: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
9f30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
9f40: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
9f50: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
9f60: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
9f70: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
9f80: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
9f90: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
9fa0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
9fb0: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
9fc0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9fd0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
9fe0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9ff0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
a000: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
a010: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
a020: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
a030: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
a040: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
a050: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
a060: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a070: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
a080: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
a090: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
a0a0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
a0b0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
a0c0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
a0d0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
a0e0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
a0f0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
a100: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
a110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a120: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a130: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a140: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
a150: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
a160: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
a170: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a180: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
a190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a1a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  K;.}../*.** Sear
a1b0: 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ch the free-list
a1c0: 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72   on page pPg for
a1d0: 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
a1e0: 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74  a cell nByte byt
a1f0: 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49  es in.** size. I
a200: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
a210: 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nd, return a poi
a220: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63  nter to the spac
a230: 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a  e and remove it.
a240: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ** from the free
a250: 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -list..**.** If 
a260: 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63  no suitable spac
a270: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f  e can be found o
a280: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
a290: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
a2a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a2b0: 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72  n may detect cor
a2c0: 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70  ruption within p
a2d0: 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69  Pg.  If corrupti
a2e0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65  on is.** detecte
a2f0: 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73  d then *pRc is s
a300: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52  et to SQLITE_COR
a310: 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RUPT and NULL is
a320: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
a330: 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20 61 74   If a slot of at
a340: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
a350: 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  es is found but 
a360: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62  cannot be used b
a370: 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 72 65  ecause .** there
a380: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74 20   are already at 
a390: 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d 65 6e  least 60 fragmen
a3a0: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ted bytes on the
a3b0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 4e 55   page, return NU
a3c0: 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  LL..** In this c
a3d0: 61 73 65 2c 20 69 66 20 70 62 44 65 66 72 61 67  ase, if pbDefrag
a3e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
a3f0: 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 44  t NULL, set *pbD
a400: 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a  efrag to true..*
a410: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
a420: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
a430: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
a440: 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  e, int *pRc, int
a450: 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20 20 63   *pbDefrag){.  c
a460: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
a470: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
a480: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
a490: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
a4a0: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 69    int iAddr;.  i
a4b0: 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75 73 61  nt pc;.  int usa
a4c0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
a4d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
a4e0: 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68 64 72  .  for(iAddr=hdr
a4f0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
a500: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
a510: 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63 29 7b  ))>0; iAddr=pc){
a520: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a540: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a550: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
a560: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
a570: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
a580: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
a590: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
a5a0: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
a5b0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
a5c0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
a5d0: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
a5e0: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
a5f0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a600: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a610: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a620: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
a630: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
a640: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
a650: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
a660: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
a670: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
a680: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a690: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
a6a0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
a6b0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
a6c0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
a6d0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
a6e0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
a6f0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
a700: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
a710: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
a720: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
a730: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
a740: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
a750: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a760: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
a770: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a780: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
a790: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
a7a0: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
a7b0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
a7c0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
a7d0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
a7e0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
a7f0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
a800: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
a810: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
a820: 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20 20  ]>=60 ){.       
a830: 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67 20     if( pbDefrag 
a840: 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31 3b  ) *pbDefrag = 1;
a850: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a860: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
a870: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
a880: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
a890: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
a8a0: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
a8b0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
a8c0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
a8d0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
a8e0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
a8f0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
a900: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
a910: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
a920: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
a930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a940: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
a950: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
a960: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a970: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a980: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9a0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a9b0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a9c0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a9d0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a9e0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
a9f0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
aa00: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa10: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa20: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
aa30: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
aa40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa50: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
aa60: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
aa70: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
aa80: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
aa90: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aaa0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
aab0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
aac0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
aad0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
aae0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
aaf0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
ab00: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ab10: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ab20: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ab30: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ab40: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ab50: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ab60: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ab70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ab80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ab90: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
aba0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
abb0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
abc0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
abd0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
abe0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
abf0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
ac00: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ac10: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ac20: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ac30: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ac40: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ac50: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ac60: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ac70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ac80: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ac90: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
aca0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
acb0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
acc0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
acd0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
ace0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
acf0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
ad00: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ad10: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ad20: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ad30: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ad40: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ad50: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ad60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ad80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ad90: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
ada0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
adb0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
adc0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
add0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
ade0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ae10: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
ae20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
ae30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ae40: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
ae60: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
ae70: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
ae80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae90: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
aea0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
aeb0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
aec0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
aed0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
aee0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aef0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
af00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
af10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
af20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
af30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
af40: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
af50: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
af60: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
af70: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
af80: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
af90: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
afa0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
afb0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
afc0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
afd0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
afe0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
aff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b000: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b010: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b020: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b030: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b040: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b050: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b060: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b070: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b080: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b090: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b0a0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b0b0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b0c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b0d0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b0e0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b0f0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b100: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b110: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b120: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b130: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b140: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b150: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b160: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b170: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b180: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b190: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b1a0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b1b0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b1c0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b1d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b1e0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b1f0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b200: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b210: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b220: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b230: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b240: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b250: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b260: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b270: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b280: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b290: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b2a0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b2b0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b2c0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b2d0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b2e0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b2f0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b300: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b310: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b320: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b330: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b340: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b350: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b360: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b370: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b380: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b390: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b3a0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b3b0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b3c0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b3d0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b3e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b3f0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b400: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b410: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b420: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b430: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b440: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b450: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b460: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b470: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b480: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b4a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b4b0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b4c0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b4d0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b4e0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b4f0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b500: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b510: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b520: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b530: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b540: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b550: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b560: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b570: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b580: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b590: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b5a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b5b0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b5c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b5d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b5e0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b5f0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b600: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b610: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b620: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b630: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b640: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b650: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b660: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b670: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b680: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b690: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b6a0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b6b0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b6c0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b6d0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b6e0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b6f0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b700: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b710: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b720: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b730: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b740: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b750: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b760: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b770: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b780: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b790: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b7a0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b7b0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b7c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b7d0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b7e0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b7f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b800: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b810: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b820: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b830: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b840: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b850: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b860: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b870: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b880: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b890: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b8a0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b8b0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b8c0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b8d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b8e0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b8f0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
b900: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
b910: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
b920: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
b930: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
b940: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
b950: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
b960: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
b970: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
b980: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
b990: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
b9a0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
b9b0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
b9c0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
b9d0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
b9e0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
b9f0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
ba00: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
ba30: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
ba40: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
ba50: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ba60: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
ba70: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
ba80: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bab0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bac0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bad0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bb00: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bb10: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb40: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bb50: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bb60: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
bb90: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bba0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bbb0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bbc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bbd0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bbe0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bbf0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bc00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bc10: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bc20: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bc30: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bc40: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bc50: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bc60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bc70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bc80: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bc90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bca0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bcb0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bcc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bcd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bce0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bcf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
bd00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
bd10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
bd20: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
bd30: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
bd40: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
bd50: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
bd60: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
bd70: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
bd80: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
bd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bda0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdb0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
bdd0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
bde0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
bdf0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
be00: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
be10: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
be20: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
be30: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
be40: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
be50: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
be60: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
be70: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
be80: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
be90: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
bea0: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
beb0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
bec0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
bed0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
bee0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
bef0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
bf00: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
bf10: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
bf20: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
bf30: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
bf40: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
bf50: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
bf60: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
bf70: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
bf80: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
bf90: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
bfa0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
bfb0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
bfc0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
bfd0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
bfe0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
bff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
c000: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
c010: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c020: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
c030: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
c040: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
c050: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
c060: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c070: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
c080: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
c090: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
c0a0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
c0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
c0d0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
c0e0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
c0f0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
c100: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
c110: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
c120: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
c130: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
c140: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
c150: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
c160: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
c170: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
c180: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
c190: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
c1a0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
c1b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
c1c0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
c1d0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
c1e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
c1f0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
c200: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
c210: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
c220: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
c230: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
c240: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
c250: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c260: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
c270: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
c280: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
c290: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a  +2]);.      iSiz
c2a0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
c2b0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
c2c0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
c2d0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
c2e0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
c2f0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
c300: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
c310: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
c320: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
c330: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
c340: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
c350: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
c360: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
c370: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
c380: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
c390: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
c3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c3b0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
c3c0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
c3d0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
c3e0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
c3f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
c400: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
c410: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
c420: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
c430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c440: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c450: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
c460: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
c470: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
c480: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
c490: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
c4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4b0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
c4c0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
c4d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
c4f0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
c500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
c510: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
c520: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
c530: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
c540: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
c550: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
c560: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c570: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
c580: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
c5b0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
c5c0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
c5d0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
c5e0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
c5f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c600: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
c610: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
c620: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
c630: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c640: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
c650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
c660: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
c670: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
c680: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
c690: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c6a0: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
c6b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c6c0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
c6d0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c6e0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
c6f0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
c700: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c710: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
c720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
c740: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
c750: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
c760: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
c770: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
c780: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
c790: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
c7a0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
c7b0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
c7c0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
c7d0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
c7e0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
c7f0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
c800: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
c810: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
c820: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
c830: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c840: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
c850: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
c860: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
c870: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
c880: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
c890: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
c8a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c8b0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
c8c0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
c8d0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
c8e0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
c8f0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
c900: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
c910: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
c920: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
c930: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c940: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
c950: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
c960: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c970: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c980: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c990: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
c9a0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
c9b0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
c9c0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
c9d0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
c9e0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
c9f0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ca00: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ca10: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
ca20: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
ca30: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
ca40: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ca50: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
ca60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ca70: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
ca80: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
ca90: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
caa0: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
cab0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cac0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cad0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cae0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
caf0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
cb00: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
cb10: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
cb20: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
cb30: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
cb40: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
cb50: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
cb60: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
cb70: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
cb80: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
cb90: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
cba0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
cbb0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
cbc0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
cbd0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
cbe0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
cbf0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
cc00: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
cc10: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
cc20: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
cc30: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
cc40: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
cc50: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
cc60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cc70: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
cc80: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
cc90: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
cca0: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
ccb0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ccc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ccd0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
cce0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
ccf0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
cd00: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
cd10: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
cd20: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
cd30: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
cd40: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cd50: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
cd60: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
cd70: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
cd80: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
cd90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cda0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
cdb0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
cdc0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
cdd0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
cde0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
cdf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ce00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ce10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ce20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ce30: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ce40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ce50: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ce60: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
ce70: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
ce80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ce90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
cea0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
ceb0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
cec0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
ced0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
cef0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
cf00: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
cf10: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
cf20: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
cf30: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
cf40: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
cf50: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
cf60: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
cf70: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
cf80: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
cf90: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
cfa0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
cfb0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
cfc0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
cfd0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
cfe0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
cff0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
d000: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
d010: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
d020: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
d030: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d040: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d050: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
d060: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
d070: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d080: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d090: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d0a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d0b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d0c0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
d0d0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0e0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
d0f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d100: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
d110: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d120: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d130: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d140: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
d150: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d160: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d170: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
d180: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d190: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
d1a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d1b0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
d1c0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
d1d0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
d1e0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
d1f0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
d200: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
d210: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
d220: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
d230: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
d240: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
d250: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
d270: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
d280: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
d290: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
d2a0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
d2b0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d2c0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
d2d0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
d2e0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
d2f0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
d300: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
d310: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
d320: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d330: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
d340: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
d350: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
d360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d370: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
d380: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d390: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
d3a0: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
d3b0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d3c0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
d3d0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
d3e0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d3f0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d400: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
d410: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
d420: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
d430: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
d440: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d450: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
d460: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
d470: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d480: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
d490: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
d4a0: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
d4b0: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
d4c0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
d4d0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
d4e0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
d4f0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
d500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d510: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d520: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
d530: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
d540: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
d550: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
d560: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d570: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d580: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
d590: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d5a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d5b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d5c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
d5d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
d5e0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
d5f0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
d600: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
d610: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
d620: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
d630: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
d640: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
d650: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
d660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
d670: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
d680: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d690: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
d6a0: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
d6b0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
d6c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
d6d0: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
d6e0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
d6f0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
d700: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
d710: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d720: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d730: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
d740: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d750: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
d760: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d770: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
d780: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
d790: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
d7a0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d7b0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
d7c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d7d0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
d7e0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
d7f0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
d800: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
d810: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
d820: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
d830: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d840: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d850: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d860: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d870: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
d880: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
d890: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
d8a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
d8b0: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
d8c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
d8d0: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
d8e0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
d8f0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
d900: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d910: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
d920: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
d930: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
d940: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d950: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
d960: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
d970: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
d980: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
d990: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
d9a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d9b0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
d9c0: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
d9d0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
d9e0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
d9f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
da00: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
da10: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
da20: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
da30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
da40: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
da50: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
da60: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
da70: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
da80: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
da90: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
daa0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
dab0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
dac0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
dad0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
dae0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
daf0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
db00: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
db10: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
db20: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
db30: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
db40: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
db50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
db60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
db70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
db80: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
db90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dba0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dbb0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dbc0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dbd0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dbe0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dbf0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dc00: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc10: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dc20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dc30: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dc40: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dc50: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dc60: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dc70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dc80: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dc90: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dca0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dcb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dcc0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dcd0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dce0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dcf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd00: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd10: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dd20: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
dd30: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
dd40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd50: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dd60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd70: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
dd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dda0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ddb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ddc0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ddd0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
dde0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
ddf0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
de00: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
de10: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
de20: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
de30: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
de40: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
de50: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
de60: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
de70: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
de80: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
de90: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
dea0: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
deb0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
dec0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
ded0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
dee0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
def0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
df00: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
df10: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
df20: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
df30: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
df40: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
df50: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
df60: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
df70: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
df80: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
df90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
dfa0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
dfb0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
dfc0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
dfd0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
dfe0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
dff0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
e000: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
e010: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
e020: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
e030: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
e040: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
e050: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
e060: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
e070: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e080: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e090: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e0a0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
e0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
e0c0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
e0d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
e0e0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e0f0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
e100: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
e110: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e120: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e130: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
e140: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
e150: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
e160: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
e170: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
e180: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
e190: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e1a0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
e1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
e1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
e1e0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
e1f0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
e200: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e210: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
e220: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
e230: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
e240: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e250: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
e260: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e270: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
e280: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
e290: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
e2a0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
e2b0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
e2c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
e2d0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
e2e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
e2f0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
e300: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
e310: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
e320: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
e330: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
e340: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
e350: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e360: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
e370: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
e380: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
e390: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
e3a0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
e3b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
e3c0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e3d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e3e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e3f0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
e400: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
e410: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
e420: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
e430: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
e440: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e460: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
e470: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
e480: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
e490: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
e4a0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
e4b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
e4c0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
e4d0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
e4e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
e4f0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e500: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
e510: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
e520: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
e530: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e540: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
e550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e560: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e570: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e580: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
e590: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e5a0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e5b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e5c0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
e5d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e5e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e5f0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e600: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
e610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e620: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e630: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e640: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e650: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e660: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e670: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
e680: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
e690: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
e6a0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
e6b0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
e6c0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
e6d0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
e6e0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
e6f0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
e700: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
e710: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
e720: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
e730: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
e740: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
e750: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e760: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
e770: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
e780: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
e790: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
e7a0: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
e7b0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
e7c0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
e7d0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
e7e0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
e7f0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
e800: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
e810: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e820: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
e830: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e840: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
e850: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
e860: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
e870: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
e880: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
e890: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
e8a0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
e8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
e8c0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
e8d0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e8e0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
e8f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
e900: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
e910: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
e920: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
e930: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
e940: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
e950: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
e960: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
e970: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
e980: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
e990: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
e9a0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
e9b0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
e9c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
e9d0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
e9e0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
e9f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
ea00: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
ea10: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
ea20: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
ea30: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
ea40: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
ea50: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
ea60: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
ea70: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
ea80: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
ea90: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
eaa0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
eab0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
eac0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ead0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
eae0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
eaf0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
eb00: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
eb10: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
eb20: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
eb30: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
eb40: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
eb50: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
eb60: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
eb70: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
eb80: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
eb90: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
eba0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
ebb0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
ebc0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
ebd0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ebe0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ebf0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ec00: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ec10: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ec20: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ec30: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ec40: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ec50: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ec60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ec70: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ec80: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ec90: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
eca0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
ecb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ecc0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
ecd0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
ece0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
ecf0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
ed00: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
ed10: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
ed20: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ed30: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
ed40: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
ed50: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
ed60: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
ed70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ed80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
ed90: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
eda0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
edb0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
edc0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
edd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ede0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
edf0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
ee00: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee10: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ee20: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
ee30: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
ee40: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
ee50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ee60: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
ee70: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
ee80: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
ee90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
eea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
eeb0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
eec0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
eed0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
eee0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
eef0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
ef00: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
ef10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
ef20: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ef30: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ef40: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ef50: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ef60: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
ef70: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
ef80: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
ef90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
efa0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
efb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
efc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
efd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
efe0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
eff0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
f000: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
f010: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
f020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
f030: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
f040: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
f050: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
f060: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
f070: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f080: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f090: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
f0a0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
f0b0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
f0c0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
f0d0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
f0e0: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
f0f0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
f100: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
f110: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
f120: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
f130: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
f140: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
f150: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
f160: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
f170: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
f180: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
f190: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f1a0: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f1b0: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
f1c0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
f1d0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
f1e0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
f1f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
f200: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
f210: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
f220: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
f230: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
f240: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
f250: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
f260: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f270: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
f280: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
f290: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
f2a0: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
f2b0: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
f2c0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
f2d0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
f2e0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
f2f0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
f300: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
f310: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f320: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f330: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
f340: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f370: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
f380: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
f390: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
f3a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f3b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
f3c0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
f3d0: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
f3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
f3f0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
f400: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
f410: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
f420: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f430: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f440: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
f450: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
f460: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
f470: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
f480: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
f490: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
f4a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f4b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
f4c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
f4d0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
f4e0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
f4f0: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
f500: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f510: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
f520: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
f530: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
f540: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
f550: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f560: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f570: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
f580: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
f590: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
f5a0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
f5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
f5c0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
f5d0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
f5e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f5f0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
f600: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
f610: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
f620: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
f630: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
f640: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
f650: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
f660: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f670: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
f680: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f690: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f6a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f6b0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
f6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
f6d0: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
f6e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
f6f0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f700: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
f710: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
f720: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f730: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f740: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f750: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f760: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f770: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f780: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f790: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f7a0: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
f7b0: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
f7c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f7d0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
f7e0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
f7f0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
f800: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
f810: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
f820: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
f830: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f840: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
f850: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
f860: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f870: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
f880: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
f890: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
f8a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f8b0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
f8c0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
f8d0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
f8e0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
f8f0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
f900: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
f910: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
f920: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
f930: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
f940: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
f950: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
f960: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
f970: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
f980: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f990: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
f9a0: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
f9b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
f9c0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
f9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f9e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f9f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
fa00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fa10: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa20: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
fa30: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
fa40: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
fa50: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
fa60: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
fa70: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
fa80: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
fa90: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
faa0: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
fab0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
fac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
fad0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
fae0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
faf0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
fb00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb10: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
fb20: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
fb30: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
fb40: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
fb50: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
fb60: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
fb70: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
fb80: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
fb90: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
fba0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
fbb0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
fbc0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
fbd0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
fbe0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
fbf0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fc00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
fc10: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
fc20: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
fc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
fc40: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
fc50: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
fc60: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fc70: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
fc80: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
fc90: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
fca0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fcb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
fcc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
fcd0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
fce0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
fcf0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
fd00: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
fd10: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
fd20: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
fd30: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
fd40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fd50: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
fd60: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
fd70: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
fd80: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
fd90: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
fda0: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
fdb0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
fdc0: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
fdd0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
fde0: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
fdf0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
fe00: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
fe10: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fe20: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
fe30: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
fe40: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
fe50: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
fe60: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
fe70: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
fe80: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
fe90: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fea0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
feb0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
fec0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
fed0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
fee0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
fef0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
ff00: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
ff10: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
ff20: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
ff30: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
ff40: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
ff50: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
ff60: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
ff70: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
ff80: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ff90: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
ffa0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
ffb0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
ffc0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
ffd0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
ffe0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
fff0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
10000 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
10010 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
10020 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
10030 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
10040 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
10050 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
10060 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
10070 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
10080 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
10090 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
100a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
100b0 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
100c0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
100d0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
100e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
100f0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
10100 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
10110 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
10120 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
10130 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10140 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
10150 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10160 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
10170 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
10180 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
10190 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
101a0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
101b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
101c0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
101d0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
101e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
101f0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
10200 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10210 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10220 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10230 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
10240 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
10250 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
10260 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
10270 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
10290 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
102a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
102b0 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
102c0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
102d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
102e0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
102f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10300 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
10310 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10320 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10330 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
10340 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
10350 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
10360 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
10370 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10380 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
10390 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
103a0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
103b0 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
103c0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
103d0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
103e0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
103f0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
10400 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
10410 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
10420 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
10430 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
10440 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
10450 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
10460 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10470 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
10480 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
10490 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
104a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
104b0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
104c0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
104d0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
104e0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
104f0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
10500 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10510 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
10520 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10530 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
10540 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
10550 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
10560 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10570 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
10580 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10590 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
105a0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
105b0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
105c0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
105d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
105f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10600 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
10610 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
10620 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
10630 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
10640 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
10650 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
10660 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
10670 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
10680 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
10690 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
106a0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
106b0 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
106c0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
106d0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
106e0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
106f0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
10700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
10710 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
10720 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
10730 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
10740 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
10750 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
10760 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
10770 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
10780 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
10790 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
107a0 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
107b0 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
107c0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
107d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
107e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
107f0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
10800 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10810 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
10820 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
10830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10840 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
10850 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10860 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
10870 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10880 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10890 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
108a0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
108b0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
108c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
108d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
108e0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
108f0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10900 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10910 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
10920 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
10930 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
10940 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
10950 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
10960 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
10970 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
10980 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
10990 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
109a0 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
109b0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
109c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
109d0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
109e0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
109f0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
10a00 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
10a10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
10a20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
10a30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
10a40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
10a50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
10a60 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10a70 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10a80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10a90 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
10aa0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
10ab0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
10ac0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
10ad0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ae0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
10af0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
10b10 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
10b20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
10b30 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
10b40 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
10b50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
10b60 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
10b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10ba0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
10be0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
10c00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10c10 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
10c20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
10c30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c40 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10c50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10c60 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
10c70 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10c80 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
10c90 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10ca0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10cb0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
10cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10cd0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
10ce0 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
10cf0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
10d00 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10d10 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10d20 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
10d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10d40 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
10d50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
10d60 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
10d70 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d80 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
10d90 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
10da0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
10db0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
10dc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
10dd0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
10de0 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
10df0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
10e00 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
10e30 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
10e40 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
10e50 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
10e60 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
10e70 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
10e80 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
10e90 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
10ea0 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
10eb0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
10ec0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
10ed0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
10ee0 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f40 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10f50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10f60 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10f70 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f90 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
10fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10fb0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10fc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10fe0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
10ff0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
11000 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
11010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11020 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11040 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
11050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11060 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
11070 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
11080 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11090 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
110a0 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
110b0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
110c0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
110d0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
110e0 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
110f0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
11100 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
11110 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
11120 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
11130 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
11140 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
11150 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
11160 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
11170 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
11180 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
11190 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
111a0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
111b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
111c0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
111d0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
111e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
111f0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
11200 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11210 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
11220 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
11230 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
11240 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
11250 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
11260 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
11270 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
11280 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
11290 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
112a0 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
112b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
112c0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
112d0 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
112e0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
112f0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
11300 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
11310 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
11320 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
11330 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
11340 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
11350 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
11360 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
11370 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
11380 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
11390 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
113a0 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
113b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
113c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
113d0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
113e0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
113f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11400 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
11410 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
11420 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
11440 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
11450 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
11460 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
11470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
11490 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
114a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
114b0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
114c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
114d0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
114e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
114f0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
11500 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
11510 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11530 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
11540 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
11550 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
11560 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
11570 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
11580 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11590 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
115a0 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
115b0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
115c0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
115d0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
115e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
115f0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
11600 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
11610 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
11620 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
11630 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
11640 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
11650 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
11660 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
11670 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
11680 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
11690 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
116a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
116b0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
116c0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
116d0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
116e0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
116f0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
11700 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
11710 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
11720 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
11730 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
11740 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11760 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
11770 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
11780 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
11790 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
117a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
117b0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
117c0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
117d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
117e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
117f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
11800 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
11810 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
11820 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
11830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11840 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11850 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
11860 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
11870 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
11880 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11890 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
118a0 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
118b0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
118c0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
118d0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
118e0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
118f0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
11900 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
11910 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11920 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
11930 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11940 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
11950 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
11960 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
11970 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
11980 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
11990 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
119a0 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
119b0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
119c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
119d0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
119e0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
119f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
11a00 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
11a10 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
11a20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
11a30 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a40 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
11a50 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
11a60 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
11a70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
11a80 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
11a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11aa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11ab0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
11ac0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
11ad0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
11ae0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
11af0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
11b00 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
11b10 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
11b20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
11b30 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
11b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
11b50 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
11b60 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
11b70 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
11b80 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
11b90 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
11ba0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
11bb0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11bc0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
11bd0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
11be0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
11bf0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
11c00 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
11c10 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
11c20 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
11c30 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
11c40 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
11c50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11c60 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11c70 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11c80 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11c90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
11ca0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
11cb0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
11cc0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
11cd0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
11ce0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
11cf0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
11d00 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
11d10 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
11d20 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
11d30 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
11d40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
11d50 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
11d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11d70 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
11d80 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
11d90 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
11da0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11db0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
11dc0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
11dd0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
11de0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
11df0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
11e00 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
11e10 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
11e20 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
11e30 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
11e40 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
11e50 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
11e60 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
11e70 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
11e80 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
11e90 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
11ea0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
11eb0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
11ec0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
11ed0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11ee0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
11ef0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
11f00 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
11f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
11f20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11f30 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
11f40 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
11f50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
11f60 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
11f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
11f90 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
11fa0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
11fb0 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
11fc0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
11fd0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
11fe0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
11ff0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
12000 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12010 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
12020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12030 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12040 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
12050 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
12060 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
12070 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
12080 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12090 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
120a0 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
120b0 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
120c0 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
120d0 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
120e0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
120f0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
12100 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
12110 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
12120 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
12130 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
12140 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
12150 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
12160 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12170 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12180 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
12190 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
121a0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
121b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
121c0 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
121d0 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
121e0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
121f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
12200 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
12210 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
12220 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
12230 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
12240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12250 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
12260 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
12270 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
12280 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
12290 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
122a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
122b0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
122c0 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
122d0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
122e0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
122f0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
12300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12310 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
12320 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
12330 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
12340 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
12350 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
12360 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
12370 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
12380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12390 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
123a0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
123b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
123c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123d0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
123e0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
123f0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
12400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12410 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
12420 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
12430 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12440 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
12450 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
12460 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
12470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12480 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
12490 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
124a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
124b0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
124c0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
124d0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
124e0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
124f0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
12500 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
12510 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
12520 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
12530 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
12540 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
12550 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
12560 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
12570 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12580 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
12590 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
125a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
125b0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
125c0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
125d0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
125e0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
125f0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
12600 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12620 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
12630 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12640 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
12650 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12660 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
12670 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
12680 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
12690 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
126a0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
126b0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
126c0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
126d0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
126e0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
126f0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
12700 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
12710 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
12720 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
12730 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
12740 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
12750 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
12760 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
12770 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
12780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12790 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
127a0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
127b0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
127c0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
127d0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
127e0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
127f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12800 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
12810 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
12820 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
12830 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
12840 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12850 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
12860 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
12870 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
12880 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
12890 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
128a0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
128b0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
128c0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
128d0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
128e0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
128f0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12900 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12910 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
12920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12930 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
12940 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12950 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12960 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
12970 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
12980 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
12990 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
129a0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
129b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
129c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
129d0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
129e0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
129f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
12a00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
12a10 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12a20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a30 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
12a40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
12a50 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
12a60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12a70 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
12a80 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
12a90 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
12aa0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
12ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
12ac0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
12ad0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
12ae0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
12af0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
12b00 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
12b10 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
12b20 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
12b30 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
12b40 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
12b50 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
12b60 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
12b70 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
12b80 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
12b90 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
12ba0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
12bb0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
12bc0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
12bd0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
12be0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
12bf0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
12c00 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
12c10 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
12c20 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
12c30 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
12c40 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
12c50 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
12c60 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
12c70 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
12c80 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
12c90 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
12ca0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
12cb0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
12cc0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
12cd0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
12ce0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
12cf0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
12d00 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
12d10 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
12d20 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
12d30 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
12d40 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
12d50 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
12d60 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
12d70 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
12d80 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
12d90 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
12da0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
12db0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
12dc0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
12dd0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
12de0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
12df0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
12e00 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
12e10 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
12e20 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
12e30 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
12e40 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
12e50 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
12e60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12e70 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
12e80 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
12e90 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
12ea0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
12eb0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
12ec0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
12ed0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
12ee0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
12ef0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
12f00 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
12f10 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
12f20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12f30 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12f40 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12f50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
12f60 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
12f70 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
12f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12f90 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
12fa0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
12fb0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
12fc0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
12fd0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
12fe0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
12ff0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
13000 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
13010 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
13020 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
13030 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
13040 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
13050 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13060 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
13070 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
13080 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
13090 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
130a0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
130b0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
130c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
130d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
130e0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
130f0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
13100 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
13110 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
13120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13130 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13140 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13150 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
13160 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
13170 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
13180 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
13190 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
131a0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
131b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
131c0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
131d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
131e0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
131f0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
13200 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
13210 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
13220 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
13230 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
13240 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
13250 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
13260 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
13270 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
13280 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
13290 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
132a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
132b0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
132c0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
132d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
132e0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
132f0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
13300 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
13310 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13320 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
13330 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
13340 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
13350 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
13360 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
13370 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
13380 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
13390 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
133a0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
133b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
133c0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
133d0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
133e0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
133f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
13400 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
13410 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
13420 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
13430 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
13440 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
13450 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
13460 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13470 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
13480 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
13490 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
134a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
134b0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
134c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
134d0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
134e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
134f0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
13500 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
13510 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
13520 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
13530 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
13540 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
13550 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
13560 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13570 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
13580 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
13590 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
135a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
135b0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
135c0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
135d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
135e0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
135f0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
13600 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
13610 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
13620 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
13630 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
13640 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
13650 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13670 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
13680 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13690 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
136a0 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
136b0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
136c0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
136d0 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
136e0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
136f0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
13700 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
13710 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
13720 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
13730 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
13740 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
13750 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
13760 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
13770 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
13780 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
13790 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
137a0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
137b0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
137c0 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
137d0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
137e0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
137f0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
13800 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
13810 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
13820 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
13830 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
13840 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
13850 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
13860 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
13870 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
13880 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
13890 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
138a0 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
138b0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
138c0 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
138d0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
138e0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
138f0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
13900 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13910 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
13920 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
13930 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13940 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
13950 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13960 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
13970 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
139a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
139b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
139c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
139d0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
139e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
139f0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
13a00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a20 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
13a30 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13a40 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13a50 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
13a60 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
13a70 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
13a80 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
13a90 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
13aa0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
13ab0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
13ac0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
13ad0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
13ae0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13af0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
13b00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13b10 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13b20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13b30 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13b40 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13b50 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13b60 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
13b70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13b80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13b90 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13ba0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
13bb0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
13bc0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
13bd0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
13be0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
13bf0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
13c00 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
13c10 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
13c20 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
13c30 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
13c40 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
13c50 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
13c60 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
13c70 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
13c80 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
13c90 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
13ca0 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
13cb0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
13cc0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
13cd0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
13ce0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
13cf0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
13d00 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
13d10 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
13d20 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
13d30 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
13d40 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
13d50 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
13d60 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
13d70 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
13d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13d90 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
13da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13db0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
13dc0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
13dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
13de0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
13df0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
13e00 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
13e10 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
13e20 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
13e30 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
13e40 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13e50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13e60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13e70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13e90 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
13ea0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
13eb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
13ec0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
13ed0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ef0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13f00 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13f10 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
13f20 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
13f30 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
13f40 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
13f50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
13f60 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
13f70 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
13f80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13f90 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
13fa0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
13fb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13fc0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
13fd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13fe0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
13ff0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
14000 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14010 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
14020 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
14030 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
14040 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
14050 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
14060 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14070 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
14090 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
140a0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
140b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
140c0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
140d0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
140e0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
140f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
14100 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
14110 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
14120 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
14130 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
14140 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
14150 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
14160 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
14170 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
14180 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
14190 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
141a0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
141b0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
141c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
141d0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
141e0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
141f0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
14200 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
14210 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
14220 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
14230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14240 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
14250 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
14260 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
14270 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
14280 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
14290 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
142a0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
142b0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
142c0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
142d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
142e0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
142f0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
14300 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
14310 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
14320 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
14330 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
14340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
14350 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
14360 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14370 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
14380 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
14390 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
143a0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
143b0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
143c0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
143d0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
143e0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
143f0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
14400 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
14410 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
14420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
14430 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14440 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
14450 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
14460 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14480 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
14490 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
144a0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
144b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
144c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
144d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
144e0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
144f0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
14500 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
14510 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
14520 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14530 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14540 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
14550 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14560 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
14570 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
14580 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
14590 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
145a0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
145b0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
145c0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
145d0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
145e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
145f0 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
14600 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
14610 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14620 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
14630 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
14640 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
14650 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14660 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14670 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14680 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
14690 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
146a0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
146b0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
146c0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
146d0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
146e0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
146f0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
14700 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14720 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14730 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
14740 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
14750 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14760 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
14770 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
14780 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14790 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
147a0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
147b0 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  C) || defined(SQ
147c0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
147d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
147e0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
147f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
14800 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
14810 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
14820 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
14830 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
14840 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
14850 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
14860 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
14870 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
14880 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
14890 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
148a0 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
148b0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
148c0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
148d0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
148e0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
148f0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
14900 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
14910 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
14920 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
14930 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
14940 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
14950 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
14960 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
14970 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
14980 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
14990 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
149a0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
149b0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
149c0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
149d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
149e0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
149f0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  x(Btree *p){.  a
14a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14a10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
14a20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
14a30 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
14a40 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
14a50 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65  usableSize;.}.#e
14a60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48  ndif /* SQLITE_H
14a70 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49  AS_CODEC || SQLI
14a80 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
14a90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14aa0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
14ab0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
14ac0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
14ad0 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  UUM)./*.** Retur
14ae0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14af0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
14b00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
14b10 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
14b20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
14b30 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
14b40 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
14b50 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
14b60 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
14b70 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
14b80 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
14b90 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
14ba0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
14bb0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
14bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14bd0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
14be0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
14bf0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
14c00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
14c20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14c30 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14c40 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
14c50 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
14c60 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
14c70 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
14c80 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
14c90 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
14ca0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
14cb0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
14cc0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
14cd0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
14ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14cf0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
14d00 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
14d10 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
14d20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14d30 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
14d40 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
14d50 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
14d60 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
14d70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14d80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14d90 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
14da0 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
14db0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
14dc0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
14dd0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
14de0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
14df0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
14e00 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
14e10 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
14e20 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14e30 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
14e40 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
14e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14e60 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
14e70 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
14e80 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
14e90 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
14ea0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
14eb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14ec0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
14ed0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
14ee0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
14ef0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
14f00 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
14f10 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
14f20 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14f30 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
14f40 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
14f50 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
14f60 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
14f70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14f80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
14f90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
14fa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fb0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
14fc0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
14fd0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
14fe0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
14ff0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
15000 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
15010 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
15020 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
15030 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
15040 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15050 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
15060 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
15070 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
15080 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
15090 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
150a0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
150b0 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
150c0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
150d0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
150e0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
150f0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
15100 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
15110 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
15120 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
15130 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
15140 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
15150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
15160 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
15170 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15180 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15190 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
151a0 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
151b0 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
151c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
151d0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
151e0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
151f0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
15200 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
15210 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
15220 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
15230 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
15240 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
15250 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
15260 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
15270 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
15280 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
15290 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
152a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
152b0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
152c0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
152d0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
152e0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
152f0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
15300 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
15310 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
15320 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
15330 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
15340 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
15350 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15360 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15370 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
15380 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
15390 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
153a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
153b0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
153c0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
153d0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
153e0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
153f0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
15400 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
15410 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
15420 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
15430 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
15440 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15450 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15460 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
15470 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
15480 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
15490 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
154a0 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
154b0 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
154c0 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
154d0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
154e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
154f0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
15500 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
15510 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
15520 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
15530 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
15540 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
15550 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
15560 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
15570 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
15580 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
15590 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
155a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
155b0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
155c0 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
155d0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
155e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
155f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
15600 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
15610 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
15620 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
15630 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
15640 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
15650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
15660 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
15670 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15680 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15690 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
156a0 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
156b0 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
156c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
156e0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
156f0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
15700 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15710 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
15720 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
15730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15740 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15750 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15760 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
15770 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
15780 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
15790 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
157a0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
157b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
157c0 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
157d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
157e0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
157f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15800 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
15810 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
15820 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
15830 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
15840 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
15850 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
15860 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
15870 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
15880 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
15890 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
158a0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
158b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
158c0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
158d0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
158e0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
158f0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
15900 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
15910 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
15920 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
15930 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
15940 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
15950 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
15960 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
15970 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
15980 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
15990 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
159a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
159b0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
159c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
159d0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
159e0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
159f0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
15a00 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
15a10 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
15a20 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
15a30 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
15a40 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
15a50 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
15a60 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
15a70 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
15a80 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
15a90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
15aa0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15ab0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
15ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15ad0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
15ae0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
15af0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15b00 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
15b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
15b20 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
15b30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
15b40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
15b50 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
15b60 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
15b70 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15b80 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
15b90 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
15ba0 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
15bb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15bc0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15bd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15be0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
15bf0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
15c00 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
15c10 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
15c20 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
15c30 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
15c40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
15c50 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
15c60 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
15c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
15c80 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
15c90 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
15ca0 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
15cb0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
15cc0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
15cd0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
15ce0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
15cf0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
15d00 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
15d10 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
15d20 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
15d30 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
15d40 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
15d50 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
15d60 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
15d70 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
15d80 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
15d90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15da0 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
15db0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
15dc0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
15dd0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
15de0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
15df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15e00 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
15e10 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
15e20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e40 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15e50 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15e60 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
15e70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
15e80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
15e90 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ge1);.        re
15ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
15ec0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
15ed0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
15ee0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15ef0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
15f00 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
15f10 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
15f20 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
15f30 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
15f40 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
15f50 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
15f60 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
15f70 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
15f80 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
15f90 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
15fa0 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
15fb0 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
15fc0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
15fd0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
15fe0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
15ff0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
16000 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
16010 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
16020 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
16030 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16040 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
16050 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
16060 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
16070 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
16080 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
16090 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
160a0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
160b0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
160c0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
160d0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
160e0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
160f0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16100 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16110 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
16120 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
16130 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
16140 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
16150 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
16160 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
16170 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
16180 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
16190 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
161a0 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
161b0 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
161c0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
161d0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
161e0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
161f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16200 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
16210 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
16220 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
16230 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
16240 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16250 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
16260 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
16270 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
16280 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
16290 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
162a0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
162b0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
162c0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
162d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
162e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
162f0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
16300 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
16310 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
16320 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
16330 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
16340 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
16350 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
16360 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
16370 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
16380 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
16390 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
163a0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
163b0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
163c0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
163d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
163e0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
163f0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
16400 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
16410 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
16420 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
16430 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
16440 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
16450 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
16460 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
16470 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
16480 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
16490 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
164a0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
164b0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
164c0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
164d0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
164e0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
164f0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
16500 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
16510 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
16520 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
16530 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
16540 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
16550 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
16560 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
16570 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
16580 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
16590 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
165a0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
165b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
165c0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
165d0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
165e0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
165f0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
16600 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
16610 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16620 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
16630 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
16640 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
16670 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
16680 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16690 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
166a0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
166b0 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
166c0 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
166d0 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
166e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
166f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
16700 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
16710 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
16720 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
16730 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
16740 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
16750 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
16760 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
16770 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
16780 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
16790 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
167a0 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
167b0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
167c0 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
167d0 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
167e0 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
167f0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
16800 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
16810 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
16820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
16830 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
16840 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
16850 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
16860 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
16870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16880 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
16890 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
168a0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
168b0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
168c0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
168d0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
168e0 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
168f0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
16900 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
16910 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
16920 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
16930 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
16940 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
16950 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
16960 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
16970 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
16980 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
16990 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
169a0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
169b0 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
169c0 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
169d0 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
169e0 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
169f0 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
16a00 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
16a10 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
16a20 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
16a30 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
16a40 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
16a50 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
16a60 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
16a70 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
16a80 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
16a90 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
16aa0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
16ab0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
16ac0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
16ad0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
16ae0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
16af0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
16b00 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
16b10 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
16b20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
16b30 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
16b40 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
16b50 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
16b60 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
16b70 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
16b80 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
16b90 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
16ba0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
16bb0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
16bc0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
16bd0 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
16be0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
16bf0 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
16c00 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
16c10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
16c20 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
16c30 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
16c40 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
16c50 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
16c60 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
16c70 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
16c80 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
16c90 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
16ca0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16cb0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
16cc0 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
16cd0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
16ce0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
16cf0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
16d00 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
16d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
16d20 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
16d30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
16d40 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
16d50 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
16d60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
16d70 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
16d80 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16d90 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
16da0 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
16db0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
16dc0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
16dd0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
16de0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
16df0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
16e00 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
16e10 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
16e20 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
16e30 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
16e40 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
16e50 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
16e60 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
16e70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
16e80 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
16e90 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
16ea0 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
16eb0 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
16ec0 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
16ed0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
16ee0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
16ef0 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
16f00 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
16f10 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
16f20 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
16f30 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
16f40 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
16f50 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
16f60 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
16f70 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
16f80 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
16f90 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
16fa0 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
16fb0 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
16fc0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
16fd0 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
16fe0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
16ff0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
17000 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
17010 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
17020 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
17030 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
17040 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17050 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
17060 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
17070 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
17080 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
17090 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
170a0 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
170b0 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
170c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
170d0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
170e0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
170f0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
17100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17110 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
17120 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
17130 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
17140 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
17150 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
17160 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
17170 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
17180 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17190 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
171a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
171b0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
171c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
171d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
171e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
171f0 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
17200 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
17210 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
17220 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
17230 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
17240 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
17250 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
17260 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
17270 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
17280 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
17290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
172a0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
172b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
172c0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
172d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
172e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
172f0 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
17300 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
17310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
17320 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
17330 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
17340 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
17350 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
17360 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
17370 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
17380 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
17390 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
173a0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
173b0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
173c0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
173d0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
173e0 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
173f0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
17400 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
17410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17420 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17430 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
17440 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
17450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17460 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
17470 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
17480 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
17490 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
174a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
174b0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
174c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
174d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
174e0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
174f0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
17500 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
17510 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
17520 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
17530 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
17540 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
17550 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
17560 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
17570 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
17580 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
17590 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
175a0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
175b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
175c0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
175d0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
175e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
175f0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
17600 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
17610 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
17620 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
17630 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
17640 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
17650 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
17660 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
17670 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
17680 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
17690 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
176a0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
176b0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
176c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
176d0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
176e0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
176f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17700 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
17710 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
17720 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
17730 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
17740 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
17750 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
17760 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
17770 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
17780 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
17790 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
177a0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
177b0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
177c0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
177d0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
177e0 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
177f0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
17800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17810 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
17820 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
17830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17840 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
17850 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
17860 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
17870 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
17880 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
17890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
178a0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
178b0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
178c0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
178d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
178e0 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
178f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
17900 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17910 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
17920 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
17930 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
17940 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
17950 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17970 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17980 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
17990 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
179a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
179b0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
179c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
179d0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
179e0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
179f0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
17a00 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
17a10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
17a20 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
17a30 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
17a40 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
17a50 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
17a60 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
17a70 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
17a80 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
17a90 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
17aa0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
17ab0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
17ac0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
17ad0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
17ae0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
17af0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
17b00 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
17b10 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
17b20 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
17b30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
17b40 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
17b50 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
17b60 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
17b70 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
17b80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17b90 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
17ba0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
17bb0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
17bc0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
17bd0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
17be0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
17bf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
17c00 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
17c10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17c20 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
17c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
17c40 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
17c50 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
17c60 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
17c70 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
17c80 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
17c90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17ca0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
17cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
17cc0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
17cd0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
17ce0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
17cf0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
17d00 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
17d10 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
17d20 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
17d30 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
17d40 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
17d50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
17d60 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
17d70 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
17d80 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
17d90 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
17da0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
17db0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
17dc0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
17dd0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
17de0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
17df0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
17e00 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
17e10 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
17e20 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
17e30 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
17e40 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
17e50 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
17e60 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
17e70 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
17e80 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
17e90 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
17ea0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
17eb0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
17ec0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
17ed0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
17ee0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
17ef0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
17f00 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
17f10 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
17f20 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
17f30 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
17f40 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
17f50 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
17f60 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
17f70 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
17f80 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
17f90 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
17fa0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
17fb0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
17fc0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
17fd0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
17fe0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
17ff0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
18000 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
18010 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
18020 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
18030 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
18040 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
18050 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
18060 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
18070 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18080 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18090 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
180a0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
180b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
180c0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
180d0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
180e0 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
180f0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
18100 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
18110 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
18120 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
18130 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
18140 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
18150 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
18160 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
18170 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
18180 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
18190 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
181a0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
181b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
181c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
181d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
181e0 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
181f0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
18200 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
18210 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
18220 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
18230 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
18240 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
18250 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18260 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
18270 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
18280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18290 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
182a0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
182b0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
182c0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
182d0 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e  CACHE.  /* If an
182e0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
182f0 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
18300 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
18310 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
18320 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
18330 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
18340 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
18350 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
18360 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
18370 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
18380 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
18390 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
183a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
183b0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
183c0 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  .   || (pBt->bts
183d0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
183e0 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ING)!=0.  ){.   
183f0 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
18400 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
18410 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
18420 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
18430 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
18440 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
18450 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
18460 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
18470 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
18480 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
18490 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
184a0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
184b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
184c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
184d0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
184e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
184f0 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
18500 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
18510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
18520 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
18530 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
18540 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
18550 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
18560 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
18570 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
18580 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
18590 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
185a0 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
185b0 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
185c0 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
185d0 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
185e0 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
185f0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
18600 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
18610 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
18620 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
18630 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
18640 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
18650 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
18660 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
18670 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
18680 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
18690 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
186a0 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
186b0 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
186c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
186d0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
186e0 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
186f0 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
18700 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
18710 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
18720 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
18730 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
18740 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
18750 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
18760 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
18770 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
18780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
18790 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
187a0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
187b0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
187c0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
187d0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
187e0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
187f0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
18800 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
18810 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
18820 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
18830 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
18840 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
18850 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
18860 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
18870 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
18880 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
18890 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
188a0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
188b0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
188c0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
188d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
188e0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
188f0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
18900 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
18910 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
18920 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18930 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
18940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
18950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18960 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
18970 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
18980 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
18990 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
189a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
189b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
189c0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
189d0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
189e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
189f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18a10 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
18a20 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
18a30 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
18a40 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
18a50 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
18a60 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
18a70 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
18a80 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
18a90 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
18aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
18ac0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
18ad0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
18ae0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
18af0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
18b00 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
18b10 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
18b20 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
18b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18b40 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
18b50 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
18b60 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
18b70 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
18b80 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
18b90 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
18ba0 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
18bb0 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
18bc0 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
18bd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18be0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
18bf0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
18c00 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
18c10 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
18c20 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
18c30 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
18c40 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
18c50 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
18c60 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
18c70 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
18c80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
18c90 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
18ca0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18cb0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18cc0 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
18cd0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
18ce0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
18cf0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
18d00 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
18d10 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
18d20 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
18d30 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
18d40 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
18d50 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
18d60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
18d70 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
18d80 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
18d90 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
18da0 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
18db0 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
18dc0 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
18dd0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
18de0 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
18df0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
18e00 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
18e10 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
18e20 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
18e30 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
18e40 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
18e50 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
18e60 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
18e70 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
18e80 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
18e90 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
18ea0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
18eb0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
18ec0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
18ed0 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
18ee0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
18ef0 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
18f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18f10 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
18f20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
18f30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f50 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
18f60 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
18f70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
18f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18f90 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
18fa0 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
18fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
18fc0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
18fd0 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
18fe0 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
18ff0 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
19000 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
19010 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
19020 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
19030 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
19040 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
19050 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
19060 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
19070 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
19080 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
19090 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
190a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
190b0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
190c0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
190d0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
190e0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
190f0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
19100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19110 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19120 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
19130 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19140 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
19150 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
19160 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
19170 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
19180 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
19190 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
191a0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
191b0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
191c0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
191d0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
191e0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
191f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
19200 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
19210 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
19220 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
19230 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19260 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
19270 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19290 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
192a0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
192b0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
192c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
192f0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
19300 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
19310 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
19320 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
19330 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
19340 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
19350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19360 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
19370 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
19380 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
19390 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
193a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
193b0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
193c0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
193d0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
193e0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
193f0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
19400 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
19410 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
19420 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
19430 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
19440 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
19450 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
19460 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
19470 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
19480 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
19490 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
194a0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
194b0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
194c0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
194d0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
194e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
194f0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
19500 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
19510 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
19520 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
19530 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
19540 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
19550 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
19560 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
19570 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
19580 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
19590 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
195a0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
195b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
195c0 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
195d0 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
195e0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
195f0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
19600 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
19610 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
19620 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
19630 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
19640 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
19650 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
19660 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
19670 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
19680 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
19690 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
196a0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
196b0 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
196e0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
196f0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
19700 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
19710 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
19720 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
19730 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
19740 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
19750 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
19760 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
19770 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
19780 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
19790 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
197a0 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
197b0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
197c0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
197e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
197f0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
19800 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
19810 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
19820 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
19830 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
19840 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
19850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19860 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
19870 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
19880 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
19890 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
198a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
198b0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
198c0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
198d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
198e0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
198f0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
19900 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
19910 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
19920 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
19930 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
19940 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
19950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19960 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
19970 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
19980 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
19990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
199a0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
199b0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
199c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
199d0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
199e0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
199f0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
19a00 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
19a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
19a20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
19a30 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
19a40 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
19a50 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
19a60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
19a70 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
19a80 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
19a90 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
19aa0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
19ab0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
19ac0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
19ad0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
19ae0 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
19af0 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
19b00 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
19b10 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
19b20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
19b30 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
19b40 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
19b50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
19b60 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
19b70 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
19b80 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
19b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19ba0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
19bb0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
19bc0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
19bd0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
19be0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
19bf0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
19c00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19c20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
19c30 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
19c40 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
19c50 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
19c60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
19c70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
19c80 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
19c90 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
19ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19cb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
19cc0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
19cd0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
19ce0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
19cf0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
19d00 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
19d10 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
19d20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19d30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
19d40 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
19d50 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
19d60 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
19d70 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
19d80 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
19d90 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
19da0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
19db0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
19dc0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
19dd0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
19de0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
19df0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
19e00 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
19e10 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
19e20 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
19e30 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
19e40 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
19e50 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
19e60 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
19e70 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
19e80 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
19e90 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
19ea0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
19eb0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
19ec0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
19ed0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
19ee0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
19ef0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
19f00 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
19f10 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f30 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
19f40 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
19f50 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
19f60 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
19f70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
19f80 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
19f90 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
19fa0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
19fb0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
19fc0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
19fd0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
19fe0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
19ff0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1a000 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1a010 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1a020 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1a030 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1a040 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1a050 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1a060 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1a070 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1a080 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1a090 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1a0a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a0b0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1a0c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1a0d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1a0e0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1a0f0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1a100 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1a110 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1a120 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1a130 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1a140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a150 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1a160 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1a170 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1a180 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
1a190 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
1a1a0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
1a1b0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
1a1c0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
1a1d0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
1a1e0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
1a1f0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
1a200 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
1a210 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
1a220 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
1a230 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
1a240 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
1a250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a260 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
1a270 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
1a280 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1a290 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
1a2a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1a2c0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
1a2d0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
1a2e0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
1a2f0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
1a300 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
1a310 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
1a320 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
1a330 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
1a340 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1a350 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
1a360 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1a370 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
1a380 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
1a390 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
1a3a0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
1a3b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1a3c0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
1a3d0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
1a3e0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
1a3f0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
1a400 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1a410 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1a420 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
1a430 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1a440 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1a450 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
1a460 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1a470 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1a480 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1a490 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1a4a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1a4b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
1a4c0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
1a4d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1a4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a4f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a500 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a510 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
1a520 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
1a530 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1a540 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
1a550 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1a560 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
1a570 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1a580 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
1a590 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
1a5a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a5b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a5c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1a5d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
1a5e0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
1a5f0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
1a600 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
1a610 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
1a620 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
1a630 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
1a640 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
1a650 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
1a660 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
1a670 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1a680 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
1a690 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1a6a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1a6b0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
1a6c0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
1a6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a6e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1a6f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1a700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a710 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
1a720 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1a730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a740 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1a750 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1a760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a770 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1a780 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
1a790 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
1a7a0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1a7b0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
1a7c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1a7d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1a7e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a7f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1a800 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
1a810 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
1a820 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1a830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a840 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1a850 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
1a860 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
1a870 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
1a880 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1a890 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
1a8a0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
1a8b0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
1a8c0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
1a8d0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
1a8e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1a8f0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
1a900 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
1a910 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
1a920 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
1a930 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
1a940 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
1a950 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
1a960 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
1a970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1a980 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
1a990 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1a9a0 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
1a9b0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
1a9c0 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
1a9d0 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
1a9e0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1a9f0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
1aa00 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
1aa10 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
1aa20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
1aa30 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1aa40 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
1aa50 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
1aa60 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
1aa70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1aa80 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
1aa90 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
1aaa0 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
1aab0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1aac0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1aad0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
1aae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
1aaf0 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
1ab00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
1ab10 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1ab20 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
1ab30 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
1ab40 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
1ab50 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
1ab60 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ab70 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
1ab80 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
1ab90 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
1aba0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
1abb0 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
1abc0 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
1abd0 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
1abe0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
1abf0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
1ac00 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
1ac10 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
1ac20 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
1ac30 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
1ac40 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
1ac50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ac60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1ac70 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
1ac80 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
1ac90 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1aca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1acb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1acc0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
1acd0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
1ace0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
1acf0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
1ad00 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
1ad10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ad20 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
1ad30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
1ad40 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
1ad50 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1ad60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ad70 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
1ad80 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
1ad90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ada0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1adb0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
1adc0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
1add0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
1ade0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1adf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ae00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ae10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
1ae20 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1ae30 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
1ae40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ae50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1ae60 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
1ae70 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1ae80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
1ae90 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1aea0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1aeb0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1aec0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
1aed0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
1aee0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
1aef0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
1af00 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
1af10 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
1af20 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
1af30 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
1af40 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
1af50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1af60 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
1af70 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
1af80 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
1af90 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
1afa0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
1afb0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1afc0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1afd0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
1afe0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1aff0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1b000 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1b010 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1b020 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
1b030 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
1b040 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b060 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b080 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1b090 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
1b0a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1b0b0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1b0c0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
1b0d0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
1b0e0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
1b0f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
1b100 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
1b110 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
1b120 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
1b130 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
1b140 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
1b150 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
1b160 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1b170 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1b180 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
1b190 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
1b1a0 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
1b1b0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1b1c0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1b1d0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
1b1e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1b1f0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
1b200 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
1b210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b220 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1b230 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
1b240 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
1b250 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
1b260 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
1b270 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
1b280 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
1b290 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
1b2a0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1b2b0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
1b2c0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
1b2d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1b2e0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
1b2f0 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
1b300 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1b310 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
1b320 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
1b330 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
1b340 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
1b350 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
1b360 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
1b370 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
1b380 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
1b390 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1b3a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
1b3b0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
1b3c0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
1b3d0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
1b3e0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
1b3f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1b400 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1b410 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1b420 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1b430 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
1b440 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
1b450 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b470 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b480 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
1b490 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b4b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1b4c0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
1b4d0 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
1b4e0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
1b4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1b500 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
1b510 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
1b520 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
1b530 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
1b540 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
1b550 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
1b560 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b570 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1b580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b5a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b5b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1b5c0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1b5d0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1b5e0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
1b5f0 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
1b600 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1b610 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
1b620 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1b630 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
1b640 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1b650 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
1b660 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
1b670 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1b680 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1b690 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1b6a0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
1b6b0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1b6c0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1b6d0 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
1b6e0 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
1b6f0 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
1b700 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
1b710 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
1b720 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1b730 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
1b740 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
1b750 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1b760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
1b770 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
1b780 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1b790 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
1b7a0 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
1b7b0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b7c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b7d0 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
1b7e0 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
1b7f0 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
1b800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b820 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
1b830 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
1b840 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b860 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1b870 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
1b880 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
1b890 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
1b8a0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
1b8b0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
1b8c0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
1b8d0 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
1b8e0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
1b8f0 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
1b900 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
1b910 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
1b920 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
1b930 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1b940 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
1b950 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1b960 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
1b970 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
1b980 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1b990 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1b9a0 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
1b9b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
1b9c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1b9d0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
1b9e0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1b9f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
1ba00 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
1ba10 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
1ba20 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
1ba30 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
1ba40 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
1ba50 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
1ba60 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
1ba70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
1ba80 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
1ba90 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
1baa0 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
1bab0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
1bac0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1bad0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1bae0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1baf0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
1bb00 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
1bb10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
1bb20 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
1bb30 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1bb40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1bb50 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
1bb60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bb70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1bb80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1bb90 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
1bba0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bbb0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
1bbc0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
1bbd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1bbe0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
1bbf0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
1bc00 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1bc10 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
1bc20 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
1bc30 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1bc40 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1bc50 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
1bc60 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1bc70 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
1bc80 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
1bc90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1bca0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bcb0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
1bcc0 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
1bcd0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1bce0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1bcf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1bd00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bd10 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
1bd20 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1bd30 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
1bd40 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1bd50 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
1bd60 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
1bd70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1bd80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bd90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bda0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1bdb0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1bdc0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1bdd0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1bde0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1bdf0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1be00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1be10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1be20 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
1be30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1be40 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1be50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1be60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1be70 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
1be80 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
1be90 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
1bea0 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
1beb0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
1bec0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
1bed0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1bee0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1bef0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
1bf00 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1bf10 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
1bf20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bf30 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
1bf40 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
1bf50 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
1bf60 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
1bf70 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1bf80 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
1bf90 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
1bfa0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
1bfb0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
1bfc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bfd0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1bfe0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1bff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c000 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1c010 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1c020 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
1c030 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
1c040 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1c050 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
1c060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c070 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1c080 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
1c090 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1c0a0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
1c0b0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
1c0c0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
1c0d0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
1c0e0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
1c0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c100 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1c110 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
1c120 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
1c130 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
1c140 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c150 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1c160 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
1c170 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
1c180 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1c190 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
1c1a0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1c1b0 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1c1c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1c1d0 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
1c1e0 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
1c1f0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1c200 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
1c210 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1c220 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
1c230 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
1c240 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1c250 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
1c260 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
1c270 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
1c280 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
1c290 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
1c2a0 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
1c2b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1c2c0 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1c2d0 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1c2e0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1c2f0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1c300 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1c310 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1c320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c330 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c340 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1c350 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1c360 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1c370 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1c380 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1c390 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1c3a0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1c3b0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1c3c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c3d0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1c3e0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1c3f0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1c400 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1c410 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1c420 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1c430 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1c440 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1c450 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1c460 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1c470 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1c480 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1c490 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1c4a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1c4b0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1c4c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c4d0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1c4e0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1c4f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
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 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1c520 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1c530 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c540 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1c550 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1c560 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1c570 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1c580 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1c590 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1c5a0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1c5b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1c5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c5d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1c5e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1c5f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1c600 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1c610 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1c620 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1c630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1c640 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1c650 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1c660 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1c670 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1c680 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1c690 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1c6a0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1c6b0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1c6c0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1c6d0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1c6e0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1c6f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1c700 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1c710 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1c720 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1c730 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1c740 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1c750 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1c760 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1c770 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1c780 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1c790 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1c7a0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1c7b0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1c7c0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1c7d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c7e0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1c7f0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1c800 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1c810 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1c820 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1c830 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1c840 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1c850 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1c860 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1c870 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1c880 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1c890 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1c8a0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1c8b0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1c8c0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1c8d0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1c8e0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1c8f0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1c900 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1c910 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1c920 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1c930 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1c940 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1c950 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1c960 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1c970 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1c980 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1c990 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1c9a0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1c9b0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1c9c0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1c9d0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1c9e0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1c9f0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1ca00 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1ca10 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1ca20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ca30 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1ca40 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1ca50 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1ca60 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1ca70 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1ca80 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1ca90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1caa0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1cab0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1cac0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1cad0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1cae0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1caf0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1cb00 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1cb10 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1cb20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1cb30 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1cb40 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1cb50 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1cb60 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1cb70 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1cb80 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1cb90 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1cba0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1cbb0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1cbc0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1cbd0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1cbe0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1cbf0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1cc00 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1cc10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1cc20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1cc30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1cc40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1cc50 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1cc60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1cc70 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1cc80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1cc90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1cca0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ccb0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1ccc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1ccd0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1cce0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1ccf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cd00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cd10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1cd20 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1cd30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cd40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1cd50 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1cd60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1cd70 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1cd80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1cd90 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1cda0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1cdb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cdc0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1cdd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1cde0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1cdf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ce00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ce10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ce20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ce30 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1ce40 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1ce50 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1ce60 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1ce70 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1ce80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1ce90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1cea0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1ceb0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1cec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ced0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1cee0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1cef0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cf00 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1cf10 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1cf20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1cf30 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1cf40 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1cf50 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1cf60 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1cf70 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1cf80 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1cf90 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1cfa0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1cfb0 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1cfc0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1cfd0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1cfe0 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1cff0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1d000 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1d010 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1d020 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1d030 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1d040 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1d050 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1d060 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1d070 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1d080 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1d090 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1d0a0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1d0b0 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1d0c0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1d0d0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1d0e0 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1d0f0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1d100 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1d110 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1d120 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1d130 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1d140 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1d150 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1d160 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1d170 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1d180 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1d190 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1d1a0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1d1b0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1d1c0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1d1d0 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1d1e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1d1f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1d200 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1d210 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1d220 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1d230 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1d240 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1d250 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1d260 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1d270 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1d280 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1d290 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1d2a0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1d2b0 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1d2c0 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1d2d0 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1d2e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1d2f0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1d300 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1d310 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1d320 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1d330 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1d340 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1d350 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1d360 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1d370 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1d380 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1d390 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1d3a0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1d3b0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1d3c0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1d3d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1d3e0 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1d3f0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1d400 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1d410 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1d420 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1d430 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1d440 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1d450 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1d460 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1d470 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1d480 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1d490 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1d4a0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1d4b0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1d4c0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1d4d0 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1d4e0 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1d4f0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1d500 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1d510 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1d520 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1d530 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1d540 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d550 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1d560 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1d570 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1d580 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1d590 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1d5a0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1d5b0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1d5c0 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1d5d0 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1d5e0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1d5f0 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1d600 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1d610 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1d620 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1d630 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1d640 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1d650 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1d660 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1d670 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1d680 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1d690 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1d6a0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1d6b0 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1d6c0 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1d6d0 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1d6e0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1d6f0 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1d700 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1d710 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1d720 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1d730 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1d740 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1d750 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1d760 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1d770 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d780 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1d790 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1d7a0 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1d7b0 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1d7c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1d7d0 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1d7e0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1d7f0 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1d800 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1d810 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1d820 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1d830 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1d840 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1d850 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1d860 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1d870 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d880 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1d890 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1d8a0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1d8b0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1d8c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1d8d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1d8e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1d8f0 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1d900 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1d910 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d920 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1d930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1d940 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1d950 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1d960 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1d970 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1d980 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1d990 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1d9a0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1d9b0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1d9c0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1d9d0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1d9e0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1d9f0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1da00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1da10 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1da20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1da30 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1da40 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1da50 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1da60 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1da70 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1da80 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1da90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1daa0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1dab0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1dac0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dad0 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1dae0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1daf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1db00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1db10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
1db20 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20  DataVersion--;  
1db30 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f  /* Compensate fo
1db40 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56  r pPager->iDataV
1db50 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20  ersion++; */.   
1db60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1db70 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1db80 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1db90 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1dba0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1dbb0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1dbc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1dbd0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1dbe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1dbf0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1dc00 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1dc10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dc20 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1dc30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1dc40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1dc50 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1dc60 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1dc70 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1dc80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dc90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1dca0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1dcb0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1dcc0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1dcd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1dce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dcf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1dd00 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1dd10 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1dd20 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1dd30 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1dd40 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1dd50 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72  or on any BtShar
1dd60 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1dd70 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f  * references.  O
1dd80 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e  r if the writeOn
1dd90 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ly flag is set t
1dda0 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a  o 1, then only.*
1ddb0 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72  * trip write cur
1ddc0 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72  sors and leave r
1ddd0 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68  ead cursors unch
1dde0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  anged..**.** Eve
1ddf0 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63  ry cursor is a c
1de00 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
1de10 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
1de20 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61  g cursors.** tha
1de30 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65  t belong to othe
1de40 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1de50 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
1de60 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72  en to be.** shar
1de70 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69  ing the cache wi
1de80 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
1de90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1dea0 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
1deb0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1dec0 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  . If the writeOn
1ded0 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  ly.** flag is tr
1dee0 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ue, then only wr
1def0 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64  ite-cursors need
1df00 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65   be tripped - re
1df10 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f  ad-only.** curso
1df20 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75  rs save their cu
1df30 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
1df40 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79  so that they may
1df50 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f   continue .** fo
1df60 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c  llowing the roll
1df70 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69  back. Or, if wri
1df80 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c  teOnly is false,
1df90 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1dfa0 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e   .** tripped. In
1dfb0 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f   general, writeO
1dfc0 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20  nly is false if 
1dfd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1dfe0 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20  being.** rolled 
1dff0 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68  back modified th
1e000 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1e010 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
1e020 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70  b-tree root.** p
1e030 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65  ages may be move
1e040 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  d or deleted fro
1e050 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  m the database a
1e060 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e  ltogether, makin
1e070 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66  g.** it unsafe f
1e080 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
1e090 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
1e0a0 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  ** If the writeO
1e0b0 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  nly flag is true
1e0c0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73   and an error is
1e0d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
1e0e0 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68  le .** saving th
1e0f0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
1e100 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c  on of a read-onl
1e110 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75  y cursor, all cu
1e120 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75  rsors, .** inclu
1e130 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75  ding all read-cu
1e140 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
1e150 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1e160 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1e170 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1e180 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1e190 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76  urs while.** sav
1e1a0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73  ing a cursor pos
1e1b0 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65  ition, an SQLite
1e1c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1e1d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e1e0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1e1f0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1e200 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77  t errCode, int w
1e210 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  riteOnly){.  BtC
1e220 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20  ursor *p;.  int 
1e230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e240 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74  .  assert( (writ
1e250 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74  eOnly==0 || writ
1e260 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43  eOnly==1) && BTC
1e270 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29  F_WriteFlag==1 )
1e280 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1e290 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1e2a0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1e2b0 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65  .    for(p=pBtre
1e2c0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1e2d0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1e2e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1e2f0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
1e300 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
1e310 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1e320 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
1e330 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
1e340 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1e350 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e360 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
1e370 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
1e380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e3a0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
1e3b0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1e3c0 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
1e3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1e3e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e3f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e410 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1e420 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1e430 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
1e440 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1e450 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
1e460 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1e470 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1e480 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1e490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e4a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1e4b0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1e4c0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1e4d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1e4e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e4f0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e500 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e510 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
1e520 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
1e530 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1e540 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
1e550 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
1e560 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
1e570 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
1e580 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
1e590 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1e5a0 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
1e5b0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
1e5c0 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
1e5d0 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
1e5e0 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
1e5f0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
1e600 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1e610 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
1e620 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
1e630 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
1e640 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1e650 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1e660 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1e670 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1e680 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1e690 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1e6a0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1e6b0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1e6c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e6d0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1e6e0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1e6f0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
1e700 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
1e710 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e720 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
1e730 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
1e740 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
1e750 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
1e760 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e770 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1e780 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
1e790 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
1e7a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
1e7b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1e7c0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
1e7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e7e0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
1e7f0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1e800 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1e810 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
1e820 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
1e830 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1e840 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1e850 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1e860 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
1e870 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1e880 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
1e890 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
1e8a0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1e8b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
1e8c0 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
1e8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
1e8e0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1e8f0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
1e900 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
1e910 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1e920 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1e930 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1e940 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1e950 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1e960 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1e970 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1e980 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1e990 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1e9a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1e9b0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1e9c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1e9d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e9e0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1e9f0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1ea00 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1ea10 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1ea20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1ea30 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1ea40 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1ea50 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1ea60 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1ea70 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1ea80 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1ea90 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1eaa0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1eab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1eac0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1ead0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1eae0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1eaf0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1eb00 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1eb10 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1eb20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1eb30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1eb40 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1eb50 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1eb60 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1eb70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1eb80 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1eb90 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1eba0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1ebb0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1ebc0 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1ebd0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1ebe0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1ebf0 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1ec00 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1ec10 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1ec20 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1ec30 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1ec40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1ec50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ec60 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1ec70 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1ec80 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1ec90 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
1eca0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1ecb0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1ecc0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1ecd0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1ece0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1ecf0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1ed00 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1ed10 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1ed20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1ed30 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1ed40 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1ed50 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1ed60 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1ed70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1ed80 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1ed90 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1eda0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1edb0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1edc0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1edd0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1ede0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1edf0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1ee00 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1ee10 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1ee20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1ee30 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1ee40 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1ee50 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1ee60 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1ee70 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1ee80 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1ee90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1eea0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1eeb0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1eec0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1eed0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1eee0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1eef0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1ef00 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1ef10 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1ef20 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1ef30 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1ef40 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1ef50 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1ef60 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1ef70 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1ef80 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1ef90 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1efa0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1efb0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1efc0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1efd0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1efe0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1eff0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1f000 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1f010 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1f020 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f030 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1f040 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f050 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1f060 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1f070 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1f080 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f090 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1f0a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f0b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1f0c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f0d0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1f0e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1f0f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1f100 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f110 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1f120 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1f130 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1f140 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1f150 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1f160 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1f170 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1f180 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1f190 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1f1a0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1f1b0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1f1c0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1f1d0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1f1e0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1f1f0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1f200 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1f210 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1f220 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1f230 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1f240 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1f250 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1f260 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1f270 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1f280 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1f290 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1f2a0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1f2b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1f2c0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1f2d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f2e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1f2f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1f300 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1f310 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1f320 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1f330 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f340 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1f350 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1f360 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1f370 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1f380 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1f390 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1f3a0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1f3b0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1f3c0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1f3d0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1f3e0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1f3f0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1f400 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1f410 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1f420 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1f430 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1f440 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1f450 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1f460 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1f470 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1f480 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1f490 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1f4a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1f4b0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1f4c0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1f4d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1f4e0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1f4f0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1f500 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1f510 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1f520 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1f530 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f540 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1f550 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1f560 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1f570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1f580 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1f590 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1f5a0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1f5b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1f5c0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1f5d0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1f5e0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1f5f0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1f600 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1f610 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1f620 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1f630 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f640 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1f650 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1f660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f670 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1f680 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1f690 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1f6a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f6b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1f6c0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1f6d0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1f6e0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1f6f0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1f700 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1f710 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1f720 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1f730 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1f740 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1f750 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1f760 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1f770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1f780 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1f790 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1f7a0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1f7b0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1f7c0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1f7d0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1f7e0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1f7f0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1f800 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1f810 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1f820 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1f830 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1f840 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1f850 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1f860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f870 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1f880 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1f890 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1f8a0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1f8b0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1f8c0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1f8d0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1f8e0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1f8f0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1f900 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1f910 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1f920 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1f930 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1f940 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1f950 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1f960 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1f970 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1f980 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1f990 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1f9a0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1f9b0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1f9c0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1f9d0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1f9e0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1f9f0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1fa00 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1fa10 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1fa20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1fa30 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1fa40 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1fa50 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1fa60 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1fa70 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1fa80 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1fa90 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1faa0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1fab0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1fac0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1fad0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1fae0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1faf0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1fb00 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1fb10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1fb20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1fb30 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1fb40 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1fb50 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1fb60 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1fb70 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1fb80 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1fb90 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1fba0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1fbb0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1fbc0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1fbd0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1fbe0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1fbf0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1fc00 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1fc10 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1fc20 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1fc30 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1fc40 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1fc50 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1fc60 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1fc70 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1fc80 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1fc90 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1fca0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1fcb0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1fcc0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1fcd0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1fce0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1fcf0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1fd00 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1fd10 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1fd20 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1fd30 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1fd40 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1fd50 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1fd60 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1fd70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1fd80 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1fd90 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1fda0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1fdb0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1fdc0 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1fdd0 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1fde0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1fdf0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1fe00 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1fe30 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1fe40 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1fe70 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1fe80 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1feb0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1fec0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1fed0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1fee0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1fef0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1ff00 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1ff10 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1ff20 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1ff50 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1ff60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ff70 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1ff80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1ff90 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1ffa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1ffb0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1ffc0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1ffd0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1ffe0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1fff0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
20000 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
20010 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
20020 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
20030 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
20040 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
20050 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
20060 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
20070 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
20080 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
20090 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
200a0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
200b0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
200c0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
200d0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
200e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
200f0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20100 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
20110 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
20120 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
20130 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
20140 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
20150 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
20160 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
20170 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
20180 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
20190 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
201a0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
201b0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
201c0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
201d0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
201e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
201f0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
20200 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
20210 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
20220 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
20230 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
20240 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
20250 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
20260 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
20270 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
20280 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72  LY;.  }.  if( wr
20290 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
202a0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
202b0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
202c0 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
202d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
202e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
202f0 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
20300 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
20310 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
20320 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
20330 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
20340 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
20350 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
20360 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
20370 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
20380 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
20390 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
203a0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
203b0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
203c0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
203d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
203e0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
203f0 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
20400 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
20410 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
20420 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
20430 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
20440 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72  Bt;.  assert( wr
20450 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
20460 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61  g==BTCF_WriteFla
20470 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  g );.  pCur->cur
20480 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a  Flags = wrFlag;.
20490 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
204a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
204b0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
204c0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
204d0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
204e0 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
204f0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
20500 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
20510 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
20520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20530 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
20540 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
20550 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20580 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
20590 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
205c0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
205d0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
205e0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
20610 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
20620 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
20630 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
20660 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
20670 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20680 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206a0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
206b0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
206c0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
206d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
206e0 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
206f0 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
20700 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
20710 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
20720 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20750 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
20760 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
20770 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
20780 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
20790 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
207a0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
207b0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
207c0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
207d0 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
207e0 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
207f0 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
20800 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
20810 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
20820 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
20830 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
20840 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
20850 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
20860 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
20870 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
20880 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
20890 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
208a0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
208b0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
208c0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
208d0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
208e0 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
208f0 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
20900 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
20910 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
20920 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
20930 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
20940 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
20950 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
20960 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
20970 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
20980 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
20990 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
209a0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
209b0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
209c0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
209d0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
209e0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
209f0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
20a00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
20a10 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
20a20 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
20a30 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
20a40 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
20a50 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  e));.}../*.** Cl
20a60 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
20a70 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
20a80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20a90 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
20aa0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
20ab0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
20ac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20ad0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
20ae0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
20af0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
20b00 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
20b10 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
20b20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
20b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20b40 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
20b50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20b60 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
20b70 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
20b80 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
20b90 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
20ba0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
20bb0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
20bc0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
20bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
20be0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
20bf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
20c00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
20c10 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
20c20 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
20c30 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
20c40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
20c50 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
20c60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
20c70 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
20c80 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
20c90 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
20ca0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
20cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20cc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
20cd0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
20ce0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
20cf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20d00 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
20d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20d30 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
20d40 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
20d50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
20d60 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
20d70 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
20d80 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
20d90 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
20da0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
20db0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
20dc0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
20dd0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
20de0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
20df0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
20e00 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
20e10 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
20e20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
20e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
20e40 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
20e50 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
20e60 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
20e70 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
20e80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
20e90 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
20ea0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
20eb0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
20ec0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
20ed0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
20ee0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
20ef0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
20f00 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
20f10 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
20f20 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
20f30 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
20f40 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
20f50 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
20f60 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
20f70 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
20f80 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67 72 65   not doing aggre
20f90 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
20fa0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
20fb0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
20fc0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
20fd0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
20fe0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
20ff0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
21000 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
21010 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
21020 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
21030 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
21040 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
21050 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
21060 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
21070 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
21080 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
21090 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
210a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
210b0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
210c0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
210d0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
210e0 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
210f0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
21100 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
21110 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
21120 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
21130 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
21140 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
21150 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
21160 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
21170 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
21180 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
21190 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
211a0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
211b0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
211c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
211d0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
211e0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
211f0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
21200 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
21210 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
21220 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
21230 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
21240 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
21250 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  );.      pCur->c
21260 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
21270 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d  ValidNKey;.    }
21280 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21290 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
212a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
212b0 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
212c0 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
212d0 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
212e0 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
212f0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
21300 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
21310 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
21320 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21360 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
21370 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61     \.    int iPa
213c0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
213d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50      \.    btreeP
21410 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
21420 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
21430 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
21440 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20  &pCur->info);   
21450 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d       \.    pCur-
21460 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
21470 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20  F_ValidNKey;    
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
21500 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
21510 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
21550 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
21560 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
21570 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
21580 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
21590 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
215a0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
215b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
215c0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
215d0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
215e0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
215f0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
21600 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
21610 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
21620 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
21630 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
21640 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
21650 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
21660 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
21670 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
21680 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
21690 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
216a0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
216b0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
216c0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
216d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
216e0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
216f0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
21700 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
21710 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
21720 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
21730 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
21740 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
21750 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
21760 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
21770 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
21780 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
21790 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
217a0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
217b0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
217c0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
217d0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
217e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
217f0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
21800 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
21810 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
21820 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
21830 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
21840 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
21850 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
21860 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
21870 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
21880 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
21890 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
218a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
218b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
218c0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
218d0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
218e0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
218f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21900 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21910 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
21920 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21930 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
21940 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
21950 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
21960 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ey;.  return SQL
21970 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21980 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
21990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
219a0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
219b0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
219c0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
219d0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
219e0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
219f0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
21a00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
21a10 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
21a20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
21a30 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
21a40 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
21a50 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
21a60 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
21a70 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
21a80 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
21a90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
21aa0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
21ab0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
21ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
21ad0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
21ae0 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
21af0 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
21b00 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
21b10 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
21b20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
21b30 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
21b40 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
21b50 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
21b60 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
21b70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
21b80 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
21b90 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
21ba0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
21bb0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21bc0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21bd0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21be0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21bf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21c00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21c10 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
21c20 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
21c30 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
21c40 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
21c50 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
21c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21c70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
21c80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
21c90 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
21ca0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
21cb0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
21cc0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
21cd0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
21ce0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21cf0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
21d00 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
21d10 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
21d20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
21d30 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
21d40 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
21d50 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
21d60 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
21d70 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
21d80 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
21d90 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
21da0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21db0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
21dc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
21dd0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
21de0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
21df0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
21e00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
21e10 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
21e20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
21e30 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
21e40 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
21e50 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
21e60 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
21e70 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
21e80 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
21e90 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
21ea0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
21eb0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
21ec0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
21ed0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
21ee0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
21ef0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
21f00 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
21f10 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
21f20 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
21f30 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
21f40 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
21f50 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
21f60 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
21f70 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
21f80 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
21f90 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
21fa0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
21fb0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
21fc0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
21fd0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
21fe0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
21ff0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
22000 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
22010 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
22020 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
22030 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
22040 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
22050 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
22060 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22070 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
22080 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
22090 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
220a0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
220b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
220c0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
220d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
220e0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
220f0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
22100 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
22110 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
22120 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
22130 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22140 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
22150 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
22160 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
22170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22180 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
22190 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
221a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
221b0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
221c0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
221d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
221e0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
221f0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
22200 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
22210 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
22220 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
22230 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
22240 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
22250 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
22260 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
22270 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
22280 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
22290 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
222a0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
222b0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
222c0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
222d0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
222e0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
222f0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
22300 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
22310 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
22320 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
22330 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
22340 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
22350 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
22360 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
22370 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
22380 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
22390 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
223a0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
223b0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
223c0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
223d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
223e0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
223f0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
22400 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
22410 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
22420 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
22430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22440 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
22450 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
22460 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
22470 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
22480 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
22490 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
224a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
224b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
224c0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
224d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
224e0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
224f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22500 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
22510 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
22520 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
22530 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
22540 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
22550 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22560 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
22570 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
22580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22590 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
225a0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
225b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
225c0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
225d0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
225e0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
225f0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
22600 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22610 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
22620 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
22630 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
22640 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
22650 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
22660 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
22670 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
22680 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
22690 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
226a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
226b0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
226c0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
226d0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
226e0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
226f0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
22700 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
22710 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
22720 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
22730 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
22740 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
22750 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
22760 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
22770 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
22780 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
22790 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
227a0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
227b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
227c0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
227d0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
227e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
227f0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
22800 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
22810 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
22820 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
22830 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
22840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22850 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
22860 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
22870 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
22880 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22890 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
228a0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
228b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
228c0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
228d0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
22900 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
22910 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
22920 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
22930 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
22940 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
22950 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
22960 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
22970 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
22980 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
22990 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
229a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
229b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
229c0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
229d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
229e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
229f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
22a00 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
22a10 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
22a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22a30 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
22a40 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
22a50 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
22a60 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
22a70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
22a80 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
22a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22aa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22ab0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22ac0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
22ad0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
22ae0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
22af0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
22b00 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
22b10 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
22b20 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
22b30 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22b40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
22b50 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
22b60 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
22b70 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
22b80 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
22b90 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
22ba0 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
22bb0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
22bc0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
22bd0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
22be0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
22bf0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
22c00 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
22c10 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
22c20 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
22c30 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
22c40 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
22c50 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
22c60 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
22c70 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
22c80 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
22c90 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
22ca0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
22cb0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
22cc0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
22cd0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
22ce0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
22cf0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
22d00 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
22d10 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
22d20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
22d30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
22d40 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
22d50 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
22d60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22d70 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
22d80 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
22d90 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
22da0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22db0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
22dc0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
22dd0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
22de0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
22df0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
22e00 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
22e10 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
22e20 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
22e30 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
22e40 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
22e50 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
22e60 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
22e70 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
22e80 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
22e90 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
22ea0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
22eb0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
22ec0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
22ed0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
22ee0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
22ef0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
22f00 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
22f10 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
22f20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
22f30 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
22f40 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
22f50 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
22f60 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
22f70 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
22f80 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
22f90 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
22fa0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
22fb0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
22fc0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
22fd0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
22fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
22ff0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
23000 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
23010 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
23020 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
23030 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
23040 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
23050 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
23060 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
23070 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
23080 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
23090 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
230a0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
230b0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
230c0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
230d0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
230e0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
230f0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
23100 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
23110 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
23120 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
23130 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
23140 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
23150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23160 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
23170 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
23180 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
23190 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
231a0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
231b0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
231c0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
231d0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
23200 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
23210 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
23220 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
23230 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
23240 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
23250 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
23260 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23290 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
232a0 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
232b0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
232c0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
232d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
232e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
232f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
23300 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23310 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
23320 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
23330 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23340 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23350 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
23360 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
23370 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
23380 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
23390 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
233a0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
233b0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
233c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
233d0 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
233e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
233f0 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
23400 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
23410 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
23420 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
23430 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
23440 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
23450 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
23460 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
23470 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
23480 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
23490 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
234a0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
234b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
234c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
234d0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
234e0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
234f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23500 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
23510 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
23520 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
23530 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
23540 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
23550 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
23560 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
23570 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
23580 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
23590 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
235a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
235b0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
235c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
235d0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
235e0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
235f0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
23600 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
23610 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
23620 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
23630 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
23640 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
23650 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
23660 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
23670 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23680 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
23690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
236a0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
236b0 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
236c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
236d0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
236e0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
236f0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
23700 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
23710 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
23720 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
23730 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23740 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
23750 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
23760 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
23770 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
23780 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
23790 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
237a0 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  do not allocate 
237b0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20  aOverflow[] for 
237c0 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20  eOp==2..    **. 
237d0 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
237e0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
237f0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
23800 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
23810 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
23820 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
23830 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
23840 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
23850 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
23860 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
23870 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
23880 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
23890 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
238a0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
238b0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
238c0 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
238d0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
238e0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
238f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21   */.    if( eOp!
23900 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  =2 && (pCur->cur
23910 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
23920 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20  idOvfl)==0 ){.  
23930 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
23940 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
23950 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
23960 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
23970 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
23980 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75     if( nOvfl>pCu
23990 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b  r->nOvflAlloc ){
239a0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61  .        Pgno *a
239b0 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c  New = (Pgno*)sql
239c0 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
239d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
239e0 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a  Overflow, nOvfl*
239f0 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20  2*sizeof(Pgno). 
23a00 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
23a10 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
23a20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23a30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23a50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
23a60 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
23a70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
23a80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
23a90 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
23aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23ac0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
23ad0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
23ae0 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
23af0 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
23b00 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23b10 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
23b20 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fl;.      }.    
23b30 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
23b40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23b50 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23b60 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
23b70 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
23b80 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
23b90 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
23ba0 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
23bb0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
23bc0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
23bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
23be0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
23bf0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
23c00 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61  .     && pCur->a
23c10 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
23c20 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b  ovflSize].    ){
23c30 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
23c40 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
23c50 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
23c60 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
23c70 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
23c80 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
23c90 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
23ca0 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
23cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
23cc0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
23cd0 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20   iIdx++){..     
23ce0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
23cf0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
23d00 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
23d10 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
23d20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
23d30 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
23d40 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20  dOvfl)!=0 ){.   
23d50 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
23d60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
23d70 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
23d80 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
23d90 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
23da0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23db0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
23dc0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23dd0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
23de0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
23df0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
23e00 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
23e10 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
23e20 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
23e30 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
23e40 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
23e50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
23e60 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
23e70 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
23e80 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
23e90 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
23ea0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
23eb0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
23ec0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
23ed0 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
23ee0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
23ef0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
23f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
23f10 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
23f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
23f30 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
23f40 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
23f50 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
23f60 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
23f70 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
23f80 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
23f90 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
23fa0 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
23fb0 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
23fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
23fd0 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
23fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23ff0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
24000 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
24010 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24020 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
24030 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
24040 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24050 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
24060 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
24070 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
24080 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
24090 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
240a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
240b0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
240c0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
240d0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
240e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
240f0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
24100 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
24110 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
24120 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
24130 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
24140 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
24150 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
24160 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
24170 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
24180 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
24190 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
241a0 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
241b0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
241c0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
241d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
241e0 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
241f0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
24200 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
24210 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
24220 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
24230 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
24240 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
24250 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
24260 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
24270 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
24280 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
24290 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
242a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
242b0 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
242c0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
242d0 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
242e0 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
242f0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
24300 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
24310 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
24320 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
24330 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
24340 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
24350 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
24360 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
24370 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
24380 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
24390 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
243a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
243b0 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
243c0 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
243d0 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
243e0 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
243f0 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
24400 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61    **   7) at lea
24410 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
24420 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
24430 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
24440 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
24450 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24460 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
24470 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
24480 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24490 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
244a0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
244b0 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
244c0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
244d0 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
244e0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
244f0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
24500 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
24510 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
24520 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
24530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24540 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
24550 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
24580 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
24590 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
245d0 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
245e0 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
24610 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
24620 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
24630 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
24660 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
24670 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
24680 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
24690 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
246a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
246b0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
246c0 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
246f0 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
24700 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24730 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (7) */.        )
24740 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
24750 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
24760 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
24770 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
24780 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
24790 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
247a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
247b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e            /* hen
247c0 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  ce (7) */.      
247d0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
247e0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
247f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24800 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
24810 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
24820 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
24830 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
24840 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
24850 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
24860 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
24870 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
24880 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
24890 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
248a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
248b0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
248c0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
248d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
248e0 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
248f0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
24900 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
24910 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
24920 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
24930 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
24940 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
24950 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24970 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
24980 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24990 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
249a0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
249b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
249c0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
249d0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
249e0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
249f0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
24a00 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
24a10 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
24a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24a30 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
24a40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24a50 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
24a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24a70 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
24a80 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
24a90 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
24aa0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
24ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24ac0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
24ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24ae0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
24af0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24b00 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
24b10 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
24b20 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
24b30 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
24b40 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
24b50 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
24b60 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
24b70 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
24b80 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
24b90 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
24ba0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
24bb0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
24bc0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
24bd0 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
24be0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
24bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
24c00 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
24c10 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
24c20 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
24c30 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
24c40 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
24c50 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
24c60 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
24c70 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
24c80 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
24c90 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
24ca0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
24cb0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
24cc0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
24cd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24ce0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24cf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24d00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24d10 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
24d20 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
24d30 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
24d40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
24d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24d60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24d70 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
24d80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24d90 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
24da0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
24db0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
24dc0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
24dd0 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
24de0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
24df0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
24e00 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
24e10 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
24e20 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
24e30 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
24e40 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
24e50 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
24e60 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
24e70 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
24e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24e90 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
24ea0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
24eb0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
24ec0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
24ed0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
24ee0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
24ef0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
24f00 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
24f10 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24f20 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
24f30 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
24f40 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
24f50 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
24f60 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
24f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
24f80 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
24f90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24fa0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
24fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
24fc0 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
24fd0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24fe0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24ff0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
25000 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
25010 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
25020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25030 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25040 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25050 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
25060 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
25070 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
25080 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25090 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
250a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
250b0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
250c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
250d0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
250e0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
250f0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
25100 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
25110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
25130 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25140 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
25150 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
25160 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
25170 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
25180 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
25190 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
251a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
251b0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
251c0 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
251d0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
251e0 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
251f0 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
25200 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
25210 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
25220 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
25230 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
25240 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
25250 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
25260 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
25270 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
25280 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
25290 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
252a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
252b0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
252c0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
252d0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
252e0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
252f0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
25300 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
25310 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
25320 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
25330 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
25340 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
25350 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
25360 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
25370 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
25380 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
25390 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
253a0 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
253b0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
253c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
253d0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
253e0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
253f0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
25400 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
25410 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
25420 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
25430 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
25440 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
25450 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
25460 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
25470 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
25480 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
25490 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
254a0 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
254b0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
254c0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
254d0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
254e0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
254f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
25500 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
25510 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
25520 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
25530 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
25540 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25550 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
25560 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
25570 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
25580 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
25590 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
255a0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
255b0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
255c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
255d0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
255e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
255f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25600 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25620 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
25630 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
25640 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25650 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25660 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
25670 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25680 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
25690 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
256a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
256b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
256c0 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70  0 );.  *pAmt = p
256d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
256e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
256f0 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
25700 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
25710 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
25720 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
25730 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
25740 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
25750 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
25760 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
25770 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
25780 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
25790 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
257a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
257b0 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
257c0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
257d0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
257e0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
257f0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
25800 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
25810 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
25820 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
25830 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
25840 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
25850 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
25860 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
25870 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
25880 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
25890 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
258a0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
258b0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
258c0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
258d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
258e0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
258f0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
25900 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
25910 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
25920 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
25930 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
25940 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
25950 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
25960 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
25970 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25980 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
25990 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
259a0 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
259b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
259c0 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
259d0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
259e0 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
259f0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
25a00 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
25a10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
25a20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
25a30 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
25a40 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
25a50 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
25a60 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
25a70 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
25a80 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
25a90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25aa0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
25ab0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
25ac0 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
25ad0 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
25ae0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
25af0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
25b00 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
25b10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
25b20 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
25b30 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
25b40 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
25b50 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
25b60 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
25b70 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
25b80 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
25b90 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
25ba0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
25bb0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
25bc0 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
25bd0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
25be0 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
25bf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
25c00 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
25c10 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25c20 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25c30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25c40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25c60 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
25c70 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
25c80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25c90 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
25ca0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
25cb0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
25cc0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
25cd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25ce0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
25cf0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
25d00 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
25d10 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20   &pNewPage,.    
25d20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72             (pCur
25d30 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25d40 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
25d50 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
25d60 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28  ONLY : 0);.  if(
25d70 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25d80 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
25d90 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b  i+1] = pNewPage;
25da0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  .  pCur->aiIdx[i
25db0 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  +1] = 0;.  pCur-
25dc0 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75  >iPage++;..  pCu
25dd0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
25de0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
25df0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
25e00 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
25e10 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
25e20 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
25e30 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e   || pNewPage->in
25e40 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61  tKey!=pCur->apPa
25e50 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[i]->intKey ){
25e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25e70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25e90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
25ea0 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  0./*.** Page pPa
25eb0 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
25ec0 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
25ed0 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
25ee0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
25ef0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
25f00 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
25f10 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
25f20 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
25f30 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
25f40 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
25f50 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
25f60 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
25f70 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
25f80 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
25f90 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
25fa0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
25fb0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
25fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25fd0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
25fe0 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
25ff0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
26000 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
26010 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
26020 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
26030 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
26040 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
26050 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26060 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
26070 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
26080 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
26090 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
260a0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
260b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
260c0 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
260d0 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
260e0 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
260f0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
26100 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
26110 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
26120 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
26130 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
26140 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
26150 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
26160 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
26170 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
26180 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
26190 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
261a0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
261b0 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
261c0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
261d0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
261e0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
261f0 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
26200 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
26210 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
26220 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
26230 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
26240 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
26250 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26260 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26270 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26280 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
26290 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
262a0 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
262b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
262c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
262d0 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20  ;..  /* UPDATE: 
262e0 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  It is actually p
262f0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
26300 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64  condition tested
26310 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a 20   by the assert. 
26320 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20   ** below to be 
26330 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64 61  untrue if the da
26340 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
26350 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e  orrupt. This can
26360 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f   occur if.  ** o
26370 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  ne cursor has mo
26380 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61 72  dified page pPar
26390 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66 65  ent while a refe
263a0 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68  rence to it is h
263b0 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73  eld .  ** by a s
263c0 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68  econd cursor. Wh
263d0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
263e0 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20  pen if a single 
263f0 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20  page is linked. 
26400 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68   ** into more th
26410 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
26420 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72  ructure in a cor
26430 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20  rupt database.  
26440 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
26450 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
26460 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
26470 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
26480 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
26490 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
264a0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
264b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
264c0 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66  pgno.  );.#endif
264d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
264e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
264f0 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
26500 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26510 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
26520 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
26530 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26540 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
26550 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
26560 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
26570 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
26580 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
26590 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
265a0 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  lidOvfl);.}../*.
265b0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
265c0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
265d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
265e0 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
265f0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
26600 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
26610 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
26620 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
26630 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
26640 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
26650 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
26660 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
26670 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
26680 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
26690 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
266a0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
266b0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
266c0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
266d0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
266e0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
266f0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
26700 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
26710 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
26720 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
26730 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
26740 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
26750 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
26760 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
26770 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
26780 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
26790 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
267a0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
267b0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
267c0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
267d0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
267e0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
267f0 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
26800 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
26810 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
26820 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
26830 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
26840 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
26850 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
26860 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
26870 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
26880 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
26890 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
268a0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
268b0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
268c0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
268d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
268e0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
268f0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
26900 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
26910 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
26920 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
26930 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
26940 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
26950 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
26960 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
26970 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
26980 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
26990 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
269a0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
269b0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
269c0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
269d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
269e0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
269f0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
26a00 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
26a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26a20 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26a30 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26a40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26a50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
26a60 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
26a70 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
26a80 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
26a90 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
26aa0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
26ab0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
26ac0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
26ad0 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
26ae0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
26af0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26b00 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
26b10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26b20 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61  FAULT ){.      a
26b30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
26b40 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
26b50 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
26b60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
26b70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
26b80 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
26b90 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  or(pCur);.  }.. 
26ba0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
26bb0 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  >=0 ){.    while
26bc0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20  ( pCur->iPage ) 
26bd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
26be0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26bf0 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73  Page--]);.  }els
26c00 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
26c10 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
26c20 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
26c30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
26c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c50 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
26c60 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
26c70 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
26c80 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
26c90 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
26ca0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
26cb0 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72             (pCur
26cc0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26cd0 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
26ce0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
26cf0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69  ONLY : 0);.    i
26d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26d10 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
26d20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
26d30 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
26d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
26d50 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
26d60 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  = 0;.  }.  pRoot
26d70 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
26d80 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
26d90 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
26da0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
26db0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
26dc0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
26dd0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
26de0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
26df0 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
26e00 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
26e10 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
26e20 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
26e30 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
26e40 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
26e50 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
26e60 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
26e70 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
26e80 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
26e90 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
26ea0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
26eb0 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
26ec0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
26ed0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
26ee0 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
26ef0 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
26f00 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
26f10 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
26f20 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
26f30 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
26f40 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
26f50 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
26f60 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
26f70 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
26f80 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
26f90 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
26fa0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
26fb0 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
26fc0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
26fd0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
26fe0 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
26ff0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27000 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
27010 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
27020 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
27030 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
27040 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
27050 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
27060 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
27070 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27080 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43  _BKPT;.  }..  pC
27090 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
270a0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
270b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
270c0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
270d0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
270e0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
270f0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69  ValidOvfl);..  i
27100 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
27110 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
27120 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
27130 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
27140 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
27150 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
27160 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
27170 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
27180 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27190 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
271a0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
271b0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
271c0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
271d0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
271e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
271f0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
27200 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
27210 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
27220 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
27230 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
27240 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
27250 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27260 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27270 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
27280 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
27290 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
272a0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
272b0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
272c0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
272d0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
272e0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
272f0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
27300 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
27310 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
27320 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
27330 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
27340 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
27350 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
27360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27370 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
27380 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
27390 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
273a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
273b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
273c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
273d0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
273e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
273f0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
27400 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27410 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
27420 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27430 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27440 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
27450 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
27460 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
27470 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
27480 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
27490 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
274a0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
274b0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
274c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
274d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
274e0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
274f0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
27500 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
27510 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
27520 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
27530 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
27540 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
27550 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
27560 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
27570 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
27580 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
27590 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
275a0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
275b0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
275c0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
275d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
275e0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
275f0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
27600 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
27610 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
27620 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
27630 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
27640 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
27650 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
27660 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
27670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27680 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
27690 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
276a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
276b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
276c0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
276d0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
276e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
276f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27700 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27710 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27720 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
27730 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
27740 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27750 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
27760 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
27770 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
27780 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
27790 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
277a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
277b0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
277c0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
277d0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
277e0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
277f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
27800 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
27810 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
27820 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
27830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
27840 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
27850 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
27860 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
27870 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
27880 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27890 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
278a0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
278b0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
278c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
278d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
278e0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
278f0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
27900 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
27910 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
27920 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
27930 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
27940 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
27950 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27960 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
27970 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
27980 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
27990 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
279a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
279b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
279c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
279d0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
279e0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
279f0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
27a00 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
27a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27a20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
27a30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
27a40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
27a50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
27a60 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
27a70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27a80 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
27a90 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
27aa0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
27ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27ac0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27ad0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
27ae0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
27af0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
27b00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
27b10 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
27b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27b30 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27b40 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
27b50 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
27b60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
27b70 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
27b80 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
27b90 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
27ba0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
27bb0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
27bc0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
27bd0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
27be0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
27bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
27c00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
27c10 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
27c20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
27c30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27c40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27c50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27c60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
27c70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
27c80 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
27c90 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
27ca0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
27cb0 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
27cc0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
27cd0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
27ce0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
27cf0 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
27d00 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
27d10 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
27d20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
27d30 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
27d40 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
27d50 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
27d60 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
27d70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
27d80 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27d90 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
27da0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
27db0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
27dc0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
27dd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27de0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
27df0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
27e00 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27e10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
27e20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27e30 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
27e40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27e50 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
27e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27e70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27e80 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
27e90 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
27ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
27eb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
27ec0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
27ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27ee0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
27ef0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
27f00 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
27f10 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
27f20 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
27f30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27f40 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
27f50 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
27f60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27f70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27f80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27f90 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
27fa0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27fb0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
27fc0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
27fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
27ff0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
28000 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
28010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28020 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
28030 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
28040 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
28050 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
28070 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
28080 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
28090 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
280a0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
280b0 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
280c0 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
280d0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
280e0 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
280f0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
28100 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
28110 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
28120 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
28130 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
28140 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
28150 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
28160 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
28170 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
28180 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
28190 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
281a0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
281b0 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
281c0 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
281d0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
281e0 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
281f0 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
28200 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
28210 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
28220 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
28230 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
28240 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
28250 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
28260 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
28270 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
28280 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
28290 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
282a0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
282b0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
282c0 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
282d0 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
282e0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
282f0 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
28300 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
28310 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
28320 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
28330 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
28340 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
28350 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
28380 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
28390 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
283a0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
283b0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
283c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
283d0 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
283e0 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
283f0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
28400 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
28410 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
28420 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
28430 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
28440 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
28450 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
28460 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
28470 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
28480 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
28490 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
284a0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
284c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
284d0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
284e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
284f0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
28500 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
28510 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
28520 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
28530 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
28540 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
28550 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
28560 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
28570 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
28580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28590 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
285a0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
285b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
285c0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
285d0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
285e0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
285f0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
28600 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
28610 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
28620 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
28630 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
28640 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
28650 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28660 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28670 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28690 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
286a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
286b0 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
286c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
286d0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
286e0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
286f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
28700 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
28710 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
28720 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
28730 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
28740 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
28750 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
28760 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
28770 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28780 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28790 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  D && (pCur->curF
287a0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
287b0 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20  dNKey)!=0.   && 
287c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
287d0 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
287e0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
287f0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
28800 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
28810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
28830 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
28840 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
28850 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75  tLast)!=0 && pCu
28860 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
28870 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
28880 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
28890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
288a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
288b0 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
288c0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
288d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
288e0 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
288f0 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
28900 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
28910 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
28920 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
28930 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
28940 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
28950 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
28960 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
28970 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
28980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
28990 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
289a0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
289b0 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
289c0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
289d0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
289e0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
289f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
28a00 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
28a10 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
28a20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28a30 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
28a40 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
28a50 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
28a60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28a70 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
28a80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28a90 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28aa0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28ab0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28ac0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
28ad0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28ae0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
28af0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
28b00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28b10 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
28b20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28b30 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
28b40 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
28b50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28b60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
28b70 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
28b80 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
28b90 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
28ba0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
28bb0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
28bc0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
28bd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
28be0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28bf0 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
28c00 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
28c30 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
28c40 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
28c50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
28c60 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
28c70 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
28c80 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
28c90 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
28ca0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
28cb0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
28cc0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
28cd0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
28ce0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
28cf0 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
28d00 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
28d10 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
28d20 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
28d30 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
28d40 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
28d50 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
28d60 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
28d70 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
28d80 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
28d90 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
28da0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
28db0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
28dc0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
28dd0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
28de0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
28df0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
28e00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28e10 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
28e20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28e30 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
28e40 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
28e50 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
28e60 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
28e70 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
28e80 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
28e90 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
28ea0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
28eb0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
28ec0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
28ed0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
28ee0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
28ef0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28f00 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
28f10 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
28f20 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
28f30 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
28f40 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
28f50 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
28f60 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
28f70 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
28f80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
28f90 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
28fa0 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
28fb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
28fc0 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
28fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
28fe0 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
28ff0 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75  >aDataEnd ) retu
29000 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29010 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
29020 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29030 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
29040 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
29050 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
29060 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
29070 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
29080 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
29090 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
290a0 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
290b0 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
290c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
290d0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
290e0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
290f0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
29100 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
29110 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
29120 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29140 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
29150 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
29160 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
29170 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
29180 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
29190 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
291a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
291b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
291c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
291d0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
291e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
291f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
29200 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
29210 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
29220 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
29230 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29240 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
29250 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
29270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
29280 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
29290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
292a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
292b0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
292c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
292d0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
292e0 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
292f0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
29300 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
29310 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
29320 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
29330 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
29340 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
29350 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
29360 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20  hildPtrSize;..  
29370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
29380 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
29390 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
293a0 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
293b0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
293c0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
293d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
293e0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
293f0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
29400 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
29410 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
29420 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
29430 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
29440 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
29450 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
29460 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
29470 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
29480 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
29490 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
294a0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
294b0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
294c0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
294d0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
294e0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
294f0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
29500 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
29510 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
29520 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
29530 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
29540 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
29550 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
29560 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
29570 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
29580 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
29590 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
295a0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
295b0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
295c0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
295d0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
295e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
295f0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
29600 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
29610 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
29620 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
29630 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
29640 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
29650 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
29660 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
29670 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
29680 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
29690 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
296a0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
296b0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
296c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
296d0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
296e0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
296f0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
29700 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
29710 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
29720 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
29730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29740 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
29750 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
29760 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
29770 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
29780 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
29790 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
297a0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
297b0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
297c0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
297d0 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
297e0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
297f0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
29800 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
29810 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
29820 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
29830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29840 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
29850 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
29860 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
29870 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
29880 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
29890 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
298a0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
298b0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
298c0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
298d0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
298e0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
298f0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
29900 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
29910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
29920 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
29930 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
29940 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
29950 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
29960 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
29970 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
29980 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
29990 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
299a0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
299b0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
299c0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
299d0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
299e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
299f0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
29a00 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
29a10 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
29a20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
29a30 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
29a40 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
29a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29a60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
29a70 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
29a80 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
29a90 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
29aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
29ab0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29ac0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
29ad0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29ae0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29af0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
29b00 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
29b10 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
29b20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29b30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29b40 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
29b50 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
29b60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
29b70 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
29b80 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
29b90 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
29ba0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
29bb0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
29bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29bd0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
29be0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
29bf0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
29c00 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
29c10 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
29c20 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
29c30 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
29c40 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
29c50 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
29c60 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
29c70 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
29c80 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
29c90 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
29ca0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
29cb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29cc0 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
29cd0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
29ce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29cf0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29d00 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
29d10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
29d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29d30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
29d40 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29d50 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
29d60 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
29d70 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
29d80 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
29d90 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
29da0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
29db0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
29dc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29dd0 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
29de0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29df0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
29e00 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
29e10 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
29e20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
29e30 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
29e40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
29e50 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
29e60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
29e70 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
29e80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29e90 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
29ea0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
29eb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
29ec0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29ed0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
29ee0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ef0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
29f00 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
29f10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29f20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
29f30 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
29f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29f50 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
29f60 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
29f70 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
29f80 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
29f90 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
29fa0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
29fb0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
29fc0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
29fd0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
29fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
29ff0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2a000 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2a010 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2a020 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a030 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2a040 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2a050 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2a060 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2a070 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2a080 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2a090 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2a0a0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2a0b0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2a0c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2a0d0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2a0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2a0f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2a100 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2a110 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2a120 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2a130 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2a140 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2a150 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2a160 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2a170 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2a180 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2a190 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2a1a0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2a1b0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2a1c0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2a1d0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2a1e0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2a1f0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2a200 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2a210 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2a220 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2a230 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2a240 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2a250 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2a260 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2a270 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2a280 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2a290 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2a2a0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2a2b0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2a2c0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2a2d0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2a2e0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2a2f0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2a300 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2a310 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2a320 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2a330 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2a340 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2a350 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2a360 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2a370 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2a380 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2a390 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2a3a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2a3b0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2a3c0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2a3d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2a3e0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2a3f0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2a400 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2a410 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2a420 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2a430 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2a440 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2a450 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2a460 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2a470 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2a480 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2a490 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2a4a0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2a4b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2a4c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2a4d0 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2a4e0 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2a4f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2a500 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2a510 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2a520 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2a530 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2a540 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2a550 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2a560 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2a570 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2a580 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2a590 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2a5a0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2a5b0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2a5c0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2a5d0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2a5e0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2a5f0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2a600 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2a610 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2a620 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2a630 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2a640 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2a650 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2a660 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2a670 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2a680 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2a690 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2a6a0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2a6b0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2a6c0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2a6d0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2a6e0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2a6f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2a700 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2a710 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2a720 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2a730 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2a740 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2a750 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2a760 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2a770 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2a780 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2a790 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2a7a0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2a7b0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2a7c0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2a7d0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2a7e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2a7f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2a800 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a810 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2a820 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2a830 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2a840 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2a850 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2a860 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2a870 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2a880 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2a890 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2a8a0 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  vfl)==0 );.    r
2a8b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2a8c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2a8d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2a8e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a8f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2a900 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2a910 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2a920 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2a930 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2a940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a960 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2a970 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a980 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a990 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2a9a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a9b0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2a9c0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2a9d0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2a9e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2a9f0 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
2aa00 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2aa10 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2aa20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2aa30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2aa40 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2aa50 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2aa60 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2aa70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2aa80 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
2aa90 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2aaa0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2aab0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2aac0 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
2aad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2aae0 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
2aaf0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2ab00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
2ab10 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
2ab20 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
2ab30 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
2ab40 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
2ab50 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
2ab60 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
2ab70 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
2ab80 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
2ab90 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
2aba0 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
2abb0 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
2abc0 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
2abd0 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
2abe0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
2abf0 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
2ac00 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
2ac10 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
2ac20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
2ac30 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
2ac40 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
2ac50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
2ac60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2ac70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
2ac80 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2ac90 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2aca0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2acb0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2acc0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2acd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65  urn rc;.      re
2ace0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2acf0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2ad00 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2ad10 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2ad20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2ad30 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2ad40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2ad50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2ad60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2ad70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2ad80 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2ad90 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
2ada0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2adb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2adc0 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
2add0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ade0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
2adf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2ae00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2ae10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ae20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2ae30 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2ae40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ae50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ae60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2ae70 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2ae80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ae90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2aea0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2aeb0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2aec0 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    }.}.int sqlite
2aed0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
2aee0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2aef0 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pRes){.  MemPage
2af00 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
2af10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2af20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2af30 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2af40 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2af50 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2af60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2af70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2af80 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2af90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2afa0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2afb0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2afc0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2afd0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2afe0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2aff0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2b000 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2b010 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2b020 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2b030 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2b040 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2b050 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2b060 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2b070 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b080 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ge])>=pPage->nCe
2b090 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2b0a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b0b0 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  e]--;.    return
2b0c0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2b0d0 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2b0e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2b0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b100 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2b110 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2b120 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2b130 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2b140 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2b150 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2b160 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2b170 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2b180 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2b190 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2b1a0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2b1b0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2b1c0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2b1d0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2b1e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2b1f0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2b200 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2b210 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2b220 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2b230 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2b240 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2b250 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2b260 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2b270 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2b280 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2b290 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2b2a0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2b2b0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2b2c0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2b2d0 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2b2e0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2b2f0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2b300 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2b310 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2b320 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2b330 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2b340 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2b350 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2b360 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2b370 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2b380 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2b390 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2b3a0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2b3b0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2b3c0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2b3d0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2b3e0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2b3f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2b400 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2b410 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2b420 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2b430 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2b440 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2b450 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2b460 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2b470 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2b480 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2b490 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2b4a0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2b4b0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2b4c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2b4d0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2b4e0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2b4f0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2b500 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2b510 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2b520 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2b530 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2b540 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2b550 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2b560 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2b570 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2b580 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2b590 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2b5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2b5b0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2b5c0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2b5d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2b5e0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2b5f0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2b600 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2b610 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2b620 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b630 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2b640 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2b650 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b660 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2b670 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2b680 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2b690 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2b6a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2b6b0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2b6c0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2b6d0 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
2b6e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b6f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2b700 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2b710 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2b720 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
2b730 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2b740 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2b750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b760 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2b770 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2b780 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2b790 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2b7a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2b7b0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2b7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2b7d0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2b7e0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2b7f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b800 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b810 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2b820 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2b830 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2b840 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b850 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2b860 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2b870 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20  pNext<0 ){.     
2b880 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2b890 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2b8a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b8c0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2b8d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2b8e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b8f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b900 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2b910 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2b920 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b930 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
2b940 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2b950 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2b960 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2b970 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2b980 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2b990 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
2b9a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b9b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2b9c0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2b9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
2b9e0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
2b9f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
2ba00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2ba10 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2ba20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
2ba30 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2ba40 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
2ba50 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2ba60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ba70 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2ba80 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2ba90 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ur);.    }.    a
2baa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2bab0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2bac0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2bad0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2bae0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2baf0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2bb00 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  );..    pCur->ai
2bb10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2bb20 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2bb30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2bb40 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2bb50 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2bb60 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2bb70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2bb80 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2bb90 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2bba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bbb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2bbc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2bbd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
2bbe0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2bbf0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2bc00 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2bc10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2bc20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2bc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2bc40 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2bc50 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2bc60 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2bc70 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2bc80 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2bc90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2bca0 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
2bcb0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2bcc0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2bcd0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2bce0 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2bcf0 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
2bd00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2bd10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2bd20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
2bd30 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64     || pCur->aiId
2bd40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2bd50 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70  0.   || pCur->ap
2bd60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bd70 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  ]->leaf==0.  ){.
2bd80 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2bd90 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2bda0 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Res);.  }.  pCur
2bdb0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2bdc0 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  age]--;.  return
2bdd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2bde0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2bdf0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
2be00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2be10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
2be20 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
2be30 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
2be40 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
2be50 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
2be60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2be70 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
2be80 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
2be90 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
2bea0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
2beb0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
2bec0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
2bed0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2bee0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
2bef0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
2bf00 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
2bf10 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
2bf20 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2bf30 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
2bf40 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
2bf50 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
2bf60 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
2bf70 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
2bf80 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
2bf90 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
2bfa0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
2bfb0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
2bfc0 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
2bfd0 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
2bfe0 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
2bff0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2c000 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2c010 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2c020 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2c030 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2c040 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2c050 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2c060 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2c070 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2c080 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2c090 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2c0a0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2c0b0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2c0c0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2c0d0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2c0e0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2c0f0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2c100 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2c110 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2c120 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2c130 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2c140 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2c150 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2c160 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2c170 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2c180 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2c190 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2c1a0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2c1b0 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2c1c0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2c1d0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2c1e0 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2c1f0 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2c200 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2c210 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2c220 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2c230 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2c240 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2c250 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2c260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2c270 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2c280 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2c290 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2c2a0 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2c2b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2c2c0 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2c2d0 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2c2e0 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2c2f0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2c300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2c310 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2c320 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2c330 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2c340 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2c350 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2c360 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2c370 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2c380 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2c390 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2c3a0 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2c3b0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2c3c0 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2c3d0 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2c3e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2c3f0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2c400 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2c410 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c420 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2c430 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2c440 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2c450 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2c460 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2c470 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2c480 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2c490 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2c4a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2c4b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2c4c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c4d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2c4e0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2c4f0 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2c500 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2c510 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2c520 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2c530 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2c540 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2c550 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2c560 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2c570 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2c580 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2c590 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2c5a0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2c5b0 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2c5c0 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2c5d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2c5e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2c5f0 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2c600 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2c610 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2c620 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2c630 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2c640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c650 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c660 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2c670 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2c680 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2c690 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2c6a0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2c6b0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2c6c0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2c6d0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2c6e0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2c6f0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2c700 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2c710 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
2c720 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
2c730 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2c740 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
2c750 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
2c760 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
2c770 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2c780 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
2c790 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2c7a0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
2c7b0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
2c7c0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2c7d0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
2c7e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c7f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c800 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2c810 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
2c820 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2c830 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
2c840 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2c850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
2c860 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
2c870 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
2c880 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
2c890 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c8a0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
2c8b0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
2c8c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2c8d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2c8e0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
2c8f0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2c900 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2c910 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
2c920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c930 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
2c940 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2c950 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2c960 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
2c970 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
2c980 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
2c990 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
2c9a0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
2c9b0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
2c9c0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
2c9d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
2c9e0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
2c9f0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
2ca00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ca10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2ca20 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2ca30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ca40 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
2ca50 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2ca60 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
2ca70 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
2ca80 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
2ca90 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
2caa0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
2cab0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
2cac0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
2cad0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
2cae0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
2caf0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
2cb00 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
2cb10 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
2cb20 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2cb30 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2cb40 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
2cb50 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
2cb60 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
2cb70 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2cb80 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2cb90 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
2cba0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
2cbb0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
2cbc0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
2cbd0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2cbe0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2cbf0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
2cc00 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
2cc10 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
2cc20 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
2cc30 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
2cc40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2cc50 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
2cc60 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2cc70 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
2cc80 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
2cc90 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
2cca0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2ccb0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2ccc0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2ccd0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2cce0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2ccf0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
2cd00 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
2cd10 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
2cd20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
2cd30 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
2cd40 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
2cd50 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
2cd60 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
2cd70 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2cd80 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
2cd90 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
2cda0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
2cdb0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
2cdc0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2cdd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2cde0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
2cdf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ce00 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
2ce10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
2ce20 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
2ce30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ce40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ce50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ce60 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2ce70 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2ce80 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2ce90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2cea0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2ceb0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2cec0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2ced0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2cee0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2cef0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2cf00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2cf10 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2cf20 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
2cf30 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
2cf40 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
2cf50 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2cf60 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2cf70 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
2cf80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
2cf90 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
2cfa0 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
2cfb0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2cfc0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2cfd0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
2cfe0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
2cff0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2d000 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
2d010 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
2d020 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
2d030 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
2d040 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
2d050 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
2d060 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
2d070 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
2d080 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
2d090 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2d0a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d0b0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
2d0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d0d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d0e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2d0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2d100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2d110 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2d120 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2d130 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2d140 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2d150 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2d160 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2d170 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2d180 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2d190 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2d1a0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2d1b0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2d1c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2d1d0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2d1e0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2d1f0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2d200 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
2d210 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
2d220 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
2d230 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2d240 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
2d250 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
2d260 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
2d270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d280 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d290 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d2a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
2d2b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d2c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2d2d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
2d2e0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2d2f0 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
2d300 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
2d310 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
2d320 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2d330 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
2d340 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
2d350 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
2d360 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
2d370 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
2d380 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
2d390 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
2d3a0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
2d3b0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
2d3c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d3d0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2d3e0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2d3f0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2d400 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2d410 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2d420 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d430 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2d440 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2d450 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2d460 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d470 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d480 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
2d490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d4a0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2d4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d4c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2d4d0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2d4e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2d4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2d500 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2d510 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d520 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2d530 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2d540 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2d550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d560 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d570 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2d580 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2d590 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2d5a0 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
2d5b0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2d5c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2d5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d5e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d5f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2d600 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
2d610 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
2d620 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
2d630 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
2d640 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
2d650 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
2d660 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
2d670 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
2d680 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2d690 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2d6a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d6b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
2d6c0 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
2d6d0 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
2d6e0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2d6f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
2d700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2d710 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
2d720 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
2d730 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d740 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2d750 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d760 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
2d790 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
2d7a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2d7b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2d7c0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
2d7d0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
2d7e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2d7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2d810 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d830 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d840 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d850 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
2d860 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2d870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2d890 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
2d8a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2d8b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d8c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2d8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d8e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2d8f0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2d900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2d910 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
2d920 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
2d930 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
2d940 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
2d950 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2d960 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
2d970 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
2d980 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
2d990 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d9a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2d9b0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
2d9c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2d9d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2d9e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d9f0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
2da00 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
2da10 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2da20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2da30 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
2da40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2da60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2da70 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2da80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2da90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2daa0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2dab0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2dac0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2dad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
2dae0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
2daf0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
2db00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2db10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2db20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2db30 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2db40 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2db50 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2db60 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2db70 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
2db80 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
2db90 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
2dba0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
2dbb0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
2dbc0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
2dbd0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
2dbe0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
2dbf0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
2dc00 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
2dc10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
2dc20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
2dc30 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
2dc40 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
2dc50 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2dc60 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
2dc70 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2dc80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
2dc90 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2dca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2dcb0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
2dcc0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
2dcd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2dce0 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
2dcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd00 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2dd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dd40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dd50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2dd60 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
2dd70 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
2dd80 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
2dd90 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2dda0 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
2ddb0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2ddc0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2dde0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
2ddf0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
2de00 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
2de10 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
2de20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
2de30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2de40 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2de50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2de60 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
2de70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2de80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2deb0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
2dec0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2ded0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2dee0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
2def0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
2df00 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2df10 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2df20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
2df30 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2df40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2df50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2df60 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2df70 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2df80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2df90 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
2dfa0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2dfb0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
2dfc0 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
2dfd0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
2dfe0 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
2dff0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2e000 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
2e010 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2e020 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
2e030 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
2e040 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
2e050 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2e060 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
2e070 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
2e080 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2e090 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
2e0a0 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2e0c0 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
2e0d0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
2e0e0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
2e0f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e100 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2e110 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2e120 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2e130 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2e140 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2e150 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
2e160 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2e170 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
2e180 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
2e190 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
2e1a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e1b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2e1c0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
2e1d0 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
2e1e0 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
2e1f0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
2e200 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
2e210 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
2e220 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2e230 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2e240 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
2e250 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
2e260 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2e270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e280 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2e290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e2a0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2e2b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e2c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e2d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2e2e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e2f0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2e300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e310 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
2e320 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2e330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e340 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e350 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2e360 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2e370 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
2e380 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
2e390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2e3a0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
2e3b0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2e3c0 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
2e3d0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
2e3e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e3f0 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
2e400 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
2e410 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
2e420 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
2e430 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
2e440 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
2e450 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
2e460 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
2e470 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
2e480 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
2e490 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
2e4a0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
2e4b0 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
2e4c0 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
2e4d0 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
2e4e0 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
2e4f0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2e500 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
2e510 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
2e520 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
2e530 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
2e540 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
2e550 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
2e560 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
2e570 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
2e580 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
2e590 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2e5a0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
2e5b0 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
2e5c0 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
2e5d0 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
2e5e0 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
2e5f0 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
2e600 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
2e610 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
2e620 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
2e630 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
2e640 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2e650 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
2e660 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
2e670 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
2e680 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
2e690 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
2e6a0 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
2e6b0 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
2e6c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2e6d0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
2e6e0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
2e6f0 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
2e700 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
2e710 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
2e720 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
2e730 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
2e740 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
2e750 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
2e760 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
2e770 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2e780 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
2e790 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e7a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
2e7b0 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
2e7c0 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
2e7d0 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
2e7e0 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  e))? PAGER_GET_N
2e7f0 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20  OCONTENT:0;..   
2e800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e810 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2e820 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2e830 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e840 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2e850 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2e860 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2e870 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2e880 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2e890 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2e8a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e8b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2e8c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2e8d0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2e8e0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2e8f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2e900 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2e910 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2e920 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2e930 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2e940 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2e950 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2e960 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2e970 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2e980 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2e990 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2e9a0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2e9b0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2e9c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2e9d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2e9e0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2e9f0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2ea00 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2ea10 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2ea20 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2ea30 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2ea40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2ea50 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2ea60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ea70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2ea80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ea90 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2eaa0 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2eab0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2eac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ead0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2eae0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
2eaf0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2eb00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
2eb10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2eb20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2eb30 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
2eb40 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
2eb50 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2eb60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2eb70 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
2eb80 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
2eb90 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
2eba0 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
2ebb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
2ebc0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
2ebd0 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
2ebe0 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
2ebf0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2ec00 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2ec10 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
2ec20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ec30 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2ec40 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2ec50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ec60 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2ec70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ec80 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2ec90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2eca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ecb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ecc0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
2ecd0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2ece0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2ecf0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
2ed00 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
2ed10 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
2ed20 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ed30 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
2ed40 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
2ed50 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2ed60 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
2ed70 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2ed80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ed90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
2eda0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2edb0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
2edc0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
2edd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ede0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2edf0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2ee00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ee10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ee20 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
2ee30 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
2ee40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
2ee50 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
2ee60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2ee70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
2ee80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ee90 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  le((*ppPage)->pD
2eea0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
2eeb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2eec0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2eed0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
2eee0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
2eef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
2ef00 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
2ef10 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
2ef20 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2ef30 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
2ef40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2ef50 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
2ef60 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2ef70 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2ef80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ef90 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
2efa0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
2efb0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
2efc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
2efd0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
2efe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2eff0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
2f000 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
2f010 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
2f020 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
2f030 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
2f040 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
2f050 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
2f060 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2f070 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
2f080 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2f090 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
2f0a0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
2f0b0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
2f0c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2f0d0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
2f0e0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
2f0f0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
2f100 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
2f110 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
2f120 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2f130 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
2f140 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2f150 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
2f160 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f170 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2f180 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
2f190 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2f1a0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
2f1b0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2f1c0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
2f1d0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
2f1e0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
2f1f0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f210 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
2f220 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
2f230 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2f260 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2f270 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
2f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f290 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
2f2a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2f2b0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
2f2c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f2d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2f2e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2f2f0 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
2f300 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
2f310 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
2f320 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
2f330 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
2f340 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
2f350 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
2f360 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
2f370 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
2f380 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
2f390 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2f3a0 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
2f3b0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
2f3c0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
2f3d0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
2f3e0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2f3f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2f400 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2f410 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2f420 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
2f430 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
2f440 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f450 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
2f460 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f470 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
2f480 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
2f490 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2f4a0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
2f4b0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
2f4c0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
2f4d0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
2f4e0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
2f4f0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
2f500 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
2f510 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
2f520 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
2f530 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
2f540 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2f550 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2f560 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
2f570 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
2f580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f590 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2f5a0 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
2f5b0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2f5c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2f5d0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
2f5e0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
2f5f0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
2f600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2f610 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2f620 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2f630 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
2f640 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2f650 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
2f660 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
2f670 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
2f680 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2f690 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
2f6a0 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
2f6b0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2f6c0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
2f6d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2f6e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
2f6f0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
2f700 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
2f710 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2f720 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
2f730 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
2f740 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
2f750 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2f760 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
2f770 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
2f780 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
2f790 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2f7a0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
2f7b0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
2f7c0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
2f7d0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
2f7e0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
2f7f0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
2f800 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
2f810 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
2f820 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
2f830 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
2f840 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
2f850 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
2f860 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2f870 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
2f880 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
2f890 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
2f8a0 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
2f8b0 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
2f8c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2f8d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
2f8e0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
2f8f0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
2f900 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f910 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f920 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
2f930 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f940 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2f950 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
2f960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f970 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2f980 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
2f990 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
2f9a0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2f9b0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
2f9c0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2f9d0 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
2f9e0 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
2f9f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2fa00 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
2fa10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2fa20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2fa30 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2fa40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
2fa50 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
2fa60 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2fa70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2fa80 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2fa90 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
2faa0 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
2fab0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
2fac0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
2fad0 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
2fae0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2faf0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2fb00 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
2fb10 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
2fb20 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
2fb30 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2fb40 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
2fb50 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
2fb60 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2fb70 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
2fb80 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
2fb90 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
2fba0 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
2fbb0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
2fbc0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
2fbd0 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
2fbe0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
2fbf0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
2fc00 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
2fc10 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2fc20 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
2fc30 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
2fc40 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
2fc50 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
2fc60 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
2fc70 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2fc80 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
2fc90 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
2fca0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
2fcb0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
2fcc0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
2fcd0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
2fce0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2fcf0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
2fd00 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
2fd10 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
2fd20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
2fd30 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
2fd40 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
2fd50 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
2fd60 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
2fd70 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
2fd80 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
2fd90 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
2fda0 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
2fdb0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
2fdc0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
2fdd0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
2fde0 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
2fdf0 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
2fe00 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2fe10 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
2fe20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
2fe30 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
2fe40 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
2fe50 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2fe60 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
2fe70 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
2fe80 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
2fe90 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
2fea0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2feb0 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
2fec0 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
2fed0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2fee0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2fef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ff00 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2ff10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ff20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
2ff40 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2ff50 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
2ff60 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
2ff70 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2ff80 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
2ff90 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
2ffa0 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
2ffb0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2ffc0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
2ffd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ffe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2fff0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
30000 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30010 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
30020 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
30030 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
30040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
30050 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
30060 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
30070 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
30080 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
30090 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
300a0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
300b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
300c0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
300d0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
300e0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
300f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
30100 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
30110 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
30120 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
30130 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
30140 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
30150 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
30160 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
30170 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
30180 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
30190 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
301a0 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
301b0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
301c0 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
301d0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
301e0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
301f0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
30200 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
30210 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
30220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
30230 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
30240 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
30250 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
30260 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
30270 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
30280 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
30290 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
302a0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
302b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
302c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
302d0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
302e0 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
302f0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
30300 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
30310 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
30320 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
30330 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
30340 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
30350 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
30360 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
30370 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
30380 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
30390 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
303a0 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
303b0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
303c0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
303d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
303e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
303f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
30400 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
30410 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
30420 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
30430 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
30440 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
30450 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
30460 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
30470 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
30480 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
30490 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
304a0 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
304b0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
304c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
304d0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72   given Cell.  Wr
304e0 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c  ite the.** local
304f0 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20   Cell size (the 
30500 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
30510 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  on the original 
30520 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a  page, omitting.*
30530 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f  * overflow) into
30540 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61   *pnSize..*/.sta
30550 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
30560 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
30570 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
30580 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
30590 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
305a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
305b0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
305c0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
305d0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31  the Cell */.  u1
305e0 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  6 *pnSize       
305f0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
30600 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
30610 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  Cell here */.){.
30620 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30630 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
30640 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
30650 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
30660 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
30670 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
30680 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
30690 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
306a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
306b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
306c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
306d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
306e0 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69   &info);.  *pnSi
306f0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
30700 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
30710 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
30720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30730 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
30740 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
30750 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
30760 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
30770 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69  if( pCell+info.i
30780 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61  Overflow+3 > pPa
30790 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
307a0 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20  >maskPage ){.   
307b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
307c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a  ORRUPT_BKPT;  /*
307d0 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
307e0 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
307f0 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
30800 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
30810 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
30820 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
30830 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
30840 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
30850 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
30860 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
30870 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
30880 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
30890 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
308a0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
308b0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
308c0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
308d0 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
308e0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
308f0 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
30900 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
30910 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
30920 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
30930 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
30940 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
30950 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
30960 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
30970 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
30980 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
30990 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
309a0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
309b0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
309c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
309d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
309e0 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
309f0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
30a00 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
30a10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30a20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
30a30 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
30a40 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
30a50 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
30a60 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
30a70 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
30a80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30a90 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
30aa0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
30ab0 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
30ac0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
30ad0 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
30ae0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
30af0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
30b00 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
30b10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
30b20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
30b30 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
30b40 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
30b50 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
30b60 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
30b70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
30b80 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
30b90 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
30ba0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
30bb0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
30bc0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
30bd0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
30be0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
30bf0 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
30c00 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
30c10 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
30c20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
30c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
30c40 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
30c50 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
30c60 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
30c70 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
30c80 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
30c90 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
30ca0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
30cb0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
30cc0 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
30cd0 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
30ce0 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
30cf0 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
30d00 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
30d10 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
30d20 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
30d30 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
30d40 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
30d50 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
30d60 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
30d70 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
30d80 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
30d90 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
30da0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
30db0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
30dc0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
30dd0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
30de0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
30df0 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
30e00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
30e10 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
30e20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
30e30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
30e50 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
30e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
30e70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
30e80 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
30e90 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
30ea0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
30eb0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
30ec0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
30ed0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
30ee0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
30ef0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
30f00 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
30f10 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
30f20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
30f30 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
30f40 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
30f50 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
30f60 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
30f70 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
30f80 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
30f90 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
30fa0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
30fb0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
30fc0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
30fd0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
30fe0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
30ff0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
31000 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
31010 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
31020 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
31030 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
31040 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
31050 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
31060 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
31070 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
31080 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
31090 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
310a0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
310b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
310c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
310d0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
310e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
310f0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
31100 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
31110 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
31120 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
31130 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
31140 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
31150 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
31160 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
31170 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
31180 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
31190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
311a0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
311b0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
311c0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
311d0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
311e0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
311f0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
31200 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
31210 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
31220 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
31230 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
31240 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
31250 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
31260 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
31270 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
31280 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
31290 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
312a0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
312b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
312c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
312d0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
312e0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
312f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
31300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31310 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
31320 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
31330 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
31340 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
31350 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
31360 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
31370 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
31380 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
31390 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
313a0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
313b0 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
313c0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
313d0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
313e0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
313f0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
31400 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
31410 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
31420 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
31430 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
31440 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
31450 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
31460 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
31470 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
31480 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
31490 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
314a0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
314b0 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
314c0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
314d0 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65  ayload);.  }else
314e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44  {.    assert( nD
314f0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ata==0 );.    as
31500 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29  sert( nZero==0 )
31510 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
31520 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
31530 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
31540 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a  u64*)&nKey);.  .
31550 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
31560 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f   payload size */
31570 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
31580 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
31590 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
315a0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
315b0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
315c0 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
315d0 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
315e0 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
315f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
31600 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31610 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
31620 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
31630 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
31640 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
31650 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
31660 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
31670 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
31680 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
31690 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
316a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
316b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
316c0 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
316d0 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
316e0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
316f0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
31700 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
31710 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
31720 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
31730 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
31740 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
31750 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
31760 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
31770 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
31780 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
31790 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
317a0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
317b0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
317c0 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
317d0 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
317e0 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
317f0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
31800 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
31810 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
31820 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
31830 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
31840 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
31850 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
31860 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
31870 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
31880 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
31890 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
318a0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
318b0 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
318c0 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
318d0 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
318e0 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
318f0 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
31900 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
31910 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
31920 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
31930 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
31940 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
31950 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
31960 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
31970 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
31980 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
31990 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
319a0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
319b0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
319c0 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
319d0 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
319e0 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
319f0 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
31a00 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
31a10 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
31a20 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
31a30 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
31a40 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
31a50 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
31a60 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31a70 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
31a80 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
31a90 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
31aa0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
31ab0 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
31ac0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
31ad0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
31ae0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
31af0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
31b00 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
31b10 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
31b20 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
31b30 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
31b40 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
31b50 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
31b60 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
31b70 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
31b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
31b90 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
31ba0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
31bb0 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
31bc0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
31bd0 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
31be0 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
31bf0 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
31c00 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
31c10 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
31c20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
31c30 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
31c40 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
31c50 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
31c60 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
31c70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31c80 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
31c90 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
31ca0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
31cb0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
31cc0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
31cd0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
31ce0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
31cf0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
31d00 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
31d10 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
31d20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
31d30 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
31d40 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
31d50 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
31d60 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
31d70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
31d80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
31d90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
31da0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
31db0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
31dc0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
31dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31de0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
31df0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31e00 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31e10 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
31e20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
31e30 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
31e40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
31e50 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
31e60 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
31e70 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
31e80 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
31e90 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
31ea0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
31eb0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
31ec0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
31ed0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
31ee0 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
31ef0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
31f00 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
31f10 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
31f20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
31f30 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
31f40 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
31f50 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
31f60 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
31f70 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
31f80 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
31f90 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
31fa0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
31fb0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
31fc0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
31fd0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
31fe0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
31ff0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
32000 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
32010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32020 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
32030 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
32040 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
32050 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
32060 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
32070 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
32080 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
32090 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
320a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
320b0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
320c0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
320d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
320e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
320f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
32100 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
32110 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
32120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32130 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
32140 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
32150 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
32160 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
32170 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
32180 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
32190 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
321a0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
321b0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
321c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
321d0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
321e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
321f0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
32200 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
32210 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
32220 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
32230 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
32240 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
32250 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
32260 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
32270 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
32280 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
32290 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
322a0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
322b0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
322c0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
322d0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
322e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
322f0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
32300 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
32310 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
32320 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
32330 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
32340 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
32350 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
32360 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
32370 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
32380 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
32390 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
323a0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
323b0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
323c0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
323d0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
323e0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
323f0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
32400 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
32410 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
32420 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
32430 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
32440 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
32450 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
32460 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
32470 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
32480 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
32490 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
324a0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
324b0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
324c0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
324d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
324e0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
324f0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
32500 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
32510 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
32520 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
32530 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
32540 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
32550 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
32560 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
32570 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
32580 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
32590 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
325a0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
325b0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
325c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
325d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
325e0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
325f0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
32600 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
32610 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
32620 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
32630 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
32640 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
32650 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
32660 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
32670 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
32680 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
32690 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
326a0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
326b0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
326c0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
326d0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
326e0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
326f0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
32700 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
32710 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
32720 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
32730 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32740 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
32750 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
32760 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
32770 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
32780 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
32790 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
327a0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
327b0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
327c0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
327d0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
327e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
327f0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
32800 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
32810 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
32820 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
32830 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
32840 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
32850 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
32860 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
32870 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
32880 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
32890 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
328a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
328b0 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
328c0 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
328d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
328e0 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
328f0 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
32900 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
32910 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
32920 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
32930 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
32940 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
32950 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
32960 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
32970 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
32980 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
32990 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
329a0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
329b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
329c0 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
329d0 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
329e0 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
329f0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
32a00 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
32a10 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
32a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
32a30 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
32a40 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
32a50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32a60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32a70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
32a80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32a90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
32aa0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
32ab0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
32ac0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
32ad0 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
32ae0 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
32af0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
32b00 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
32b10 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
32b20 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
32b30 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
32b40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
32b50 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
32b60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
32b70 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32  .  if( pc < (u32
32b80 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  )get2byte(&data[
32b90 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
32ba0 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
32bb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
32bc0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
32bd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32be0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
32bf0 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
32c00 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
32c10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
32c20 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
32c30 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  urn;.  }.  pPage
32c40 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28  ->nCell--;.  if(
32c50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
32c60 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
32c70 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
32c80 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  4);.    data[hdr
32c90 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74  +7] = 0;.    put
32ca0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
32cb0 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  5], pPage->pBt->
32cc0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
32cd0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
32ce0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
32cf0 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e  leSize - pPage->
32d00 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20  hdrOffset.      
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
32d30 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65  trSize - 8;.  }e
32d40 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  lse{.    memmove
32d50 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28  (ptr, ptr+2, 2*(
32d60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69  pPage->nCell - i
32d70 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79  dx));.    put2by
32d80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
32d90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
32da0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
32db0 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   += 2;.  }.}../*
32dc0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
32dd0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
32de0 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
32df0 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
32e00 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
32e10 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
32e20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
32e30 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
32e40 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
32e50 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
32e60 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
32e70 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
32e80 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
32e90 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
32ea0 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
32eb0 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
32ec0 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
32ed0 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
32ee0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
32ef0 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
32f00 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
32f10 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
32f20 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
32f30 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
32f40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
32f50 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
32f60 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
32f70 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
32f80 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
32f90 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
32fa0 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
32fb0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
32fc0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
32fd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
32fe0 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
32ff0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
33000 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
33010 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
33020 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
33030 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
33040 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
33050 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
33060 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
33070 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
33080 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
33090 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
330a0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
330b0 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
330c0 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
330d0 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
330e0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
330f0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
33100 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
33110 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
33120 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
33130 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
33140 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
33150 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
33160 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
33170 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
33180 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
33190 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
331a0 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
331b0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
331c0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
331d0 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
331e0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
331f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
33200 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
33210 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
33220 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
33230 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
33240 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
33250 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
33260 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
33270 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
33280 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
33290 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
332a0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
332b0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
332c0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
332d0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
332e0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
332f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
33300 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
33310 6c 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66  le page */..  if
33320 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
33330 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
33340 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
33350 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
33360 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
33370 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
33380 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
33390 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
333a0 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
333b0 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
333c0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
333d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
333e0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
333f0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
33400 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
33410 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
33420 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
33430 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
33440 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
33450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33460 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33470 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
33480 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
33490 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
334a0 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
334b0 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
334c0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
334d0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
334e0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
334f0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
33500 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
33510 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
33520 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
33530 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
33540 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
33550 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
33560 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
33570 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
33580 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
33590 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
335a0 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
335b0 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
335c0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
335d0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
335e0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
335f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
33600 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
33610 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
33620 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
33630 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
33640 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
33650 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
33660 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
33670 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  Temp, pCell, sz)
33680 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
33690 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
336a0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
336b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
336c0 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
336d0 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
336e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
336f0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
33700 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
33710 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  ->apOvfl)/sizeof
33720 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30  (pPage->apOvfl[0
33730 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
33740 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43  ->apOvfl[j] = pC
33750 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
33760 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36  aiOvfl[j] = (u16
33770 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )i;.  }else{.   
33780 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
33790 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
337a0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
337b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
337c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
337d0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
337e0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
337f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
33800 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33810 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
33820 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
33830 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63  ge->aData;.    c
33840 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
33850 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
33860 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66     end = cellOff
33870 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
33880 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20  Cell;.    ins = 
33890 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
338a0 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
338b0 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
338c0 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
338d0 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
338e0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
338f0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
33900 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
33910 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
33920 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72  following two pr
33930 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20  operties.    ** 
33940 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75  if it returns su
33950 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73  ccess */.    ass
33960 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b  ert( idx >= end+
33970 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
33980 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29   idx+sz <= (int)
33990 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
339a0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  leSize );.    pP
339b0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
339c0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
339d0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
339e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
339f0 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
33a00 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
33a10 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
33a20 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
33a30 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
33a40 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
33a50 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b  a[ins+2], &data[
33a60 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a  ins], end-ins);.
33a70 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
33a80 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
33a90 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
33aa0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
33ab0 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
33ac0 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
33ad0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33ae0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
33af0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
33b00 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
33b10 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
33b20 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
33b30 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
33b40 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
33b50 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
33b60 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
33b70 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
33b80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
33b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
33ba0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
33bb0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
33bc0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
33bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
33be0 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
33bf0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
33c00 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70  o nCell b-tree p
33c10 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a  age cells. The .
33c20 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61  ** szCell[] arra
33c30 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
33c40 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
33c50 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  each cell. This 
33c60 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c  function.** repl
33c70 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aces the current
33c80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
33c90 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63  e pPg with the c
33ca0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
33cb0 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a  ell.** array..**
33cc0 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  .** Some of the 
33cd0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
33ce0 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  ] may currently 
33cf0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67  be stored in pPg
33d00 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
33d10 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20  on works around 
33d20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
33d30 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e  by this by makin
33d40 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  g a copy of any 
33d50 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62  .** such cells b
33d60 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
33d70 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  g the page data.
33d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61  .**.** The MemPa
33d90 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  ge.nFree field i
33da0 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
33db0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
33dc0 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
33dd0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
33de0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
33df0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
33e00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
33e10 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65  ebuildPage(.  Me
33e20 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
33e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e40 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20   Edit this page 
33e50 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
33e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e70 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
33e80 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
33e90 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
33ea0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
33eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
33ec0 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
33ed0 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
33ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ef0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
33f00 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
33f10 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
33f20 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
33f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
33f40 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
33f50 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63   pPg */.  u8 * c
33f60 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
33f70 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
33f80 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
33f90 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f   data for pPg */
33fa0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61  .  const int usa
33fb0 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
33fc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
33fd0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
33fe0 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c  d = &aData[usabl
33ff0 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b  eSize];.  int i;
34000 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20  .  u8 *pCellptr 
34010 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
34020 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
34030 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
34040 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
34050 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61  ager);.  u8 *pDa
34060 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62  ta;..  i = get2b
34070 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
34080 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54  ]);.  memcpy(&pT
34090 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d  mp[i], &aData[i]
340a0 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69  , usableSize - i
340b0 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45  );..  pData = pE
340c0 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nd;.  for(i=0; i
340d0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
340e0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
340f0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
34100 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20   pCell>aData && 
34110 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20  pCell<pEnd ){.  
34120 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
34130 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
34140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74  ;.    }.    pDat
34150 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  a -= szCell[i];.
34160 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
34170 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b  , pCell, szCell[
34180 69 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i]);.    put2byt
34190 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61  e(pCellptr, (pDa
341a0 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ta - aData));.  
341b0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
341c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43  .    assert( szC
341d0 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65  ell[i]==cellSize
341e0 50 74 72 28 70 50 67 2c 20 70 43 65 6c 6c 29 20  Ptr(pPg, pCell) 
341f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
34200 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
34210 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
34220 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
34230 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
34240 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
34250 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
34260 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
34270 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
34280 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
34290 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
342a0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
342b0 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
342c0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
342d0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
342e0 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
342f0 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = 0x00;.}../*.**
34300 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
34310 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
34320 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
34330 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
34340 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
34350 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
34360 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
34370 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
34380 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
34390 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
343a0 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
343b0 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
343c0 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
343d0 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
343e0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
343f0 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
34400 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
34410 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
34420 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
34430 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
34440 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
34450 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
34460 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
34470 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
34480 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
34490 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
344a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
344b0 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
344c0 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
344d0 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
344e0 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
344f0 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
34500 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
34510 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
34520 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
34530 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
34540 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
34550 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
34560 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
34570 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
34580 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
34590 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
345a0 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
345b0 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
345c0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
345d0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
345e0 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
345f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34600 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
34610 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
34620 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
34630 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
34640 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
34650 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
34660 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
34670 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
34680 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
34690 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
346a0 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
346b0 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
346c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
346d0 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
346e0 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
346f0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
34700 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
34710 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
34720 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
34730 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
34740 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
34750 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
34760 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
34770 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
34780 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
34790 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
347a0 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
347b0 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
347c0 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
347d0 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
347e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
347f0 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
34800 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
34810 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
34820 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
34830 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
34840 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
34850 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
34860 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
34870 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
34880 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
34890 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
348a0 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
348b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
348d0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
348e0 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
348f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34900 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
34910 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
34920 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
34930 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34950 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
34960 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
34970 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
34980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34990 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
349a0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
349b0 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a  o pPg */.  u8 **
349c0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
349d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
349e0 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
349f0 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
34a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
34a20 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
34a30 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44   int i;.  u8 *aD
34a40 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
34a50 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20  ;.  u8 *pData = 
34a60 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  *ppData;.  const
34a70 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d   int bFreelist =
34a80 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61   aData[1] || aDa
34a90 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ta[2];.  assert(
34aa0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
34ab0 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  Pg->hdrOffset==0
34ac0 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20   );    /* Never 
34ad0 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
34ae0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34af0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
34b00 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c    int sz = szCel
34b10 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  l[i];.    int rc
34b20 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b  ;.    u8 *pSlot;
34b30 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c 69  .    if( bFreeli
34b40 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20  st==0 || (pSlot 
34b50 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
34b60 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29  Pg, sz, &rc, 0))
34b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ==0 ){.      pDa
34b80 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ta -= sz;.      
34b90 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e  if( pData<pBegin
34ba0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
34bb0 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61     pSlot = pData
34bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
34bd0 70 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c  py(pSlot, apCell
34be0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75  [i], sz);.    pu
34bf0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
34c00 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29   (pSlot - aData)
34c10 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
34c20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  += 2;.  }.  *ppD
34c30 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72  ata = pData;.  r
34c40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
34c50 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
34c60 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
34c70 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
34c80 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
34c90 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61  szCell .** conta
34ca0 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
34cb0 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
34cc0 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
34cd0 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a  nction adds the.
34ce0 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61  ** space associa
34cf0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65  ted with each ce
34d00 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ll in the array 
34d10 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
34d20 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74  y stored .** wit
34d30 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20  hin the body of 
34d40 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66  pPg to the pPg f
34d50 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65  ree-list. The ce
34d60 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll-pointers and 
34d70 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20  other.** fields 
34d80 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20  of the page are 
34d90 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  not updated..**.
34da0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34db0 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
34dc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
34dd0 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ls added to the 
34de0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free-list..*/.st
34df0 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65  atic int pageFre
34e00 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  eArray(.  MemPag
34e10 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
34e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34e30 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69  e to edit */.  i
34e40 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
34e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34e60 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74  * Cells to delet
34e70 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
34e80 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
34e90 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
34ea0 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
34eb0 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
34ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34ed0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
34ee0 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
34ef0 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
34f00 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38  pPg->aData;.  u8
34f10 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
34f20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d  &aData[pPg->pBt-
34f30 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
34f40 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72  u8 * const pStar
34f50 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  t = &aData[pPg->
34f60 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20  hdrOffset + 8 + 
34f70 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  pPg->childPtrSiz
34f80 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d  e];.  int nRet =
34f90 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
34fa0 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  8 *pFree = 0;.  
34fb0 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a  int szFree = 0;.
34fc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
34fd0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
34fe0 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c  8 *pCell = apCel
34ff0 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
35000 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70  ell>=pStart && p
35010 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
35020 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65     int sz = szCe
35030 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ll[i];.      if(
35040 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
35050 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
35060 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
35070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
35080 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
35090 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
350a0 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
350b0 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
350c0 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
350d0 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
350e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
350f0 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
35100 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
35110 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
35120 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
35130 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
35140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35150 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
35160 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
35170 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
35180 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
35190 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
351a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
351b0 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
351c0 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
351d0 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
351e0 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
351f0 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
35200 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
35210 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
35220 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
35230 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
35240 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
35250 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
35260 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
35270 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
35280 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
35290 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
352a0 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
352b0 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
352c0 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
352d0 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
352e0 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
352f0 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
35300 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
35310 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
35320 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  w]..**.** This r
35330 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
35340 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
35350 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f  tments to pPg so
35360 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
35370 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
35380 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69   cells after bei
35390 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a  ng balanced..**.
353a0 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  ** The pPg->nFre
353b0 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
353c0 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  id when this fun
353d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
353e0 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70  t is the.** resp
353f0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
35400 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
35410 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
35420 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69  .static void edi
35430 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
35440 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
35450 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
35460 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
35470 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20  int iOld,       
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35490 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
354a0 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79  t cell currently
354b0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   on page */.  in
354c0 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20  t iNew,         
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
354e0 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69   Index of new fi
354f0 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  rst cell on page
35500 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20   */.  int nNew, 
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
35530 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
35540 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
35550 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
35560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35570 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
35580 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
35590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355a0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
355b0 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
355c0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
355d0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
355e0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
355f0 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
35600 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20  t;.  u8 *pBegin 
35610 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
35620 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e  [nNew * 2];.  in
35630 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e  t nCell = pPg->n
35640 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Cell;       /* C
35650 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70  ells stored on p
35660 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74  Pg */.  u8 *pDat
35670 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  a;.  u8 *pCellpt
35680 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
35690 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64  t iOldEnd = iOld
356a0 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20   + pPg->nCell + 
356b0 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  pPg->nOverflow;.
356c0 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20    int iNewEnd = 
356d0 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69  iNew + nNew;..#i
356e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
356f0 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  G.  u8 *pTmp = s
35700 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
35710 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
35720 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
35730 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50  (pTmp, aData, pP
35740 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
35750 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
35760 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66  * Remove cells f
35770 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e  rom the start an
35780 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  d end of the pag
35790 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c  e */.  if( iOld<
357a0 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  iNew ){.    int 
357b0 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65  nShift = pageFre
357c0 65 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  eArray(.        
357d0 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20  pPg, iNew-iOld, 
357e0 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26  &apCell[iOld], &
357f0 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20  szCell[iOld].   
35800 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28   );.    memmove(
35810 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26  pPg->aCellIdx, &
35820 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53  pPg->aCellIdx[nS
35830 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32  hift*2], nCell*2
35840 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20  );.    nCell -= 
35850 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66  nShift;.  }.  if
35860 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64  ( iNewEnd < iOld
35870 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c  End ){.    nCell
35880 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61   -= pageFreeArra
35890 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
358a0 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c  iOldEnd-iNewEnd,
358b0 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64   &apCell[iNewEnd
358c0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45  ], &szCell[iNewE
358d0 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  nd].    );.  }..
358e0 20 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61    pData = &aData
358f0 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f  [get2byteNotZero
35900 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d  (&aData[hdr+5])]
35910 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42  ;.  if( pData<pB
35920 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74  egin ) goto edit
35930 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  page_fail;..  /*
35940 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68   Add cells to th
35950 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
35960 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65  age */.  if( iNe
35970 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e  w<iOld ){.    in
35980 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65  t nAdd = MIN(nNe
35990 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20  w,iOld-iNew);.  
359a0 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d    assert( (iOld-
359b0 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43  iNew)<nNew || nC
359c0 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50  ell==0 || CORRUP
359d0 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c  T_DB );.    pCel
359e0 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c  lptr = pPg->aCel
359f0 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  lIdx;.    memmov
35a00 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64  e(&pCellptr[nAdd
35a10 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e  *2], pCellptr, n
35a20 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28  Cell*2);.    if(
35a30 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
35a40 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c  (.          pPg,
35a50 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
35a60 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
35a70 20 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65       nAdd, &apCe
35a80 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c  ll[iNew], &szCel
35a90 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20  l[iNew].    ) ) 
35aa0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
35ab0 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d  il;.    nCell +=
35ac0 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nAdd;.  }..  /*
35ad0 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f   Add any overflo
35ae0 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72  w cells */.  for
35af0 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76  (i=0; i<pPg->nOv
35b00 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  erflow; i++){.  
35b10 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69    int iCell = (i
35b20 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66  Old + pPg->aiOvf
35b30 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20  l[i]) - iNew;.  
35b40 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26    if( iCell>=0 &
35b50 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a  & iCell<nNew ){.
35b60 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d        pCellptr =
35b70 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
35b80 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20  iCell * 2];.    
35b90 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c    memmove(&pCell
35ba0 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72  ptr[2], pCellptr
35bb0 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c  , (nCell - iCell
35bc0 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43  ) * 2);.      nC
35bd0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ell++;.      if(
35be0 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
35bf0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
35c00 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
35c10 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
35c20 20 20 20 20 20 20 20 20 20 31 2c 20 26 61 70 43           1, &apC
35c30 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77  ell[iCell + iNew
35c40 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c  ], &szCell[iCell
35c50 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29   + iNew].      )
35c60 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35c70 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _fail;.    }.  }
35c80 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65  ..  /* Append ce
35c90 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  lls to the end o
35ca0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35cb0 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d  pCellptr = &pPg-
35cc0 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a  >aCellIdx[nCell*
35cd0 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  2];.  if( pageIn
35ce0 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
35cf0 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
35d00 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
35d10 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e  ,.        nNew-n
35d20 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  Cell, &apCell[iN
35d30 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65  ew+nCell], &szCe
35d40 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20  ll[iNew+nCell]. 
35d50 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61   ) ) goto editpa
35d60 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d  ge_fail;..  pPg-
35d70 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20  >nCell = nNew;. 
35d80 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
35d90 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
35da0 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
35db0 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
35dc0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
35dd0 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
35de0 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53  Data);..#ifdef S
35df0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
35e00 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26  r(i=0; i<nNew &&
35e10 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b   !CORRUPT_DB; i+
35e20 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
35e30 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65  l = apCell[i+iNe
35e40 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  w];.    int iOff
35e50 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 67   = get2byte(&pPg
35e60 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29  ->aCellIdx[i*2])
35e70 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e  ;.    if( pCell>
35e80 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c  =aData && pCell<
35e90 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d  &aData[pPg->pBt-
35ea0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
35eb0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
35ec0 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
35ed0 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  a];.    }.    as
35ee0 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
35ef0 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f  pCell, &aData[iO
35f00 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e  ff], szCell[i+iN
35f10 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ew]) );.  }.#end
35f20 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65  if..  return;. e
35f30 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20  ditpage_fail:.  
35f40 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69  /* Unable to edi
35f50 74 20 74 68 69 73 20 70 61 67 65 2e 20 52 65 62  t this page. Reb
35f60 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72  uild it from scr
35f70 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f  atch instead. */
35f80 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70  .  rebuildPage(p
35f90 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c  Pg, nNew, &apCel
35fa0 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c  l[iNew], &szCell
35fb0 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  [iNew]);.}../*.*
35fc0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
35fd0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
35fe0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
35ff0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
36000 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
36010 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
36020 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
36030 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
36040 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
36050 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
36060 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
36070 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
36080 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
36090 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
360a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
360b0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
360c0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
360d0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
360e0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
360f0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
36100 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
36110 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
36120 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
36130 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
36140 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
36150 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
36160 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
36170 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
36180 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
36190 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
361a0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
361b0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
361c0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
361d0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
361e0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
361f0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
36200 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
36210 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
36220 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
36230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
36240 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
36250 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
36260 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
36270 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
36280 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
36290 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
362a0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
362b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
362c0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
362d0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
362e0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
362f0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
36300 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
36310 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
36320 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
36330 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
36340 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
36350 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
36360 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
36370 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
36380 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
36390 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
363a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
363b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
363c0 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
363d0 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
363e0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
363f0 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
36400 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
36410 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
36420 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
36430 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
36440 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
36450 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
36460 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
36470 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
36480 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
36490 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
364a0 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
364b0 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
364c0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
364d0 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
364e0 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
364f0 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
36500 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
36510 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
36520 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
36530 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
36540 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
36550 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
36560 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
36570 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
36580 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
36590 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
365a0 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
365b0 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
365c0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
365d0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
365e0 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
365f0 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
36600 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
36610 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
36620 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
36630 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
36640 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
36650 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
36660 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
36670 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
36680 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
36690 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
366a0 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
366b0 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
366c0 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
366d0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
366e0 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
366f0 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
36700 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
36710 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
36720 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
36730 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
36740 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
36750 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
36760 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
36770 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
36780 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
36790 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
367a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
367b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
367c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
367d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
367e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36800 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
36810 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36830 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
36840 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
36850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36860 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36870 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36880 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36890 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
368a0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
368b0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
368c0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
368d0 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
368e0 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
368f0 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
36900 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
36910 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
36920 6e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  n */.  if( NEVER
36930 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  (pPage->nCell==0
36940 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
36950 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36960 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
36970 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
36980 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
36990 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
369a0 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
369b0 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
369c0 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
369d0 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
369e0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
369f0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
36a00 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
36a10 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
36a20 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
36a30 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
36a40 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
36a50 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
36a60 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
36a70 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
36a80 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
36a90 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
36aa0 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
36ab0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f  ell = pPage->apO
36ac0 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20  vfl[0];.    u16 
36ad0 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
36ae0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
36af0 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
36b00 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
36b10 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36b20 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
36b30 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
36b40 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
36b50 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
36b60 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
36b70 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
36b80 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
36b90 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
36ba0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
36bb0 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 50 61  );.    rebuildPa
36bc0 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
36bd0 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20  ll, &szCell);.  
36be0 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20    pNew->nFree = 
36bf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36c00 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73  - pNew->cellOffs
36c10 65 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b  et - 2 - szCell;
36c20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
36c30 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
36c40 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
36c50 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
36c60 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
36c70 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
36c80 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
36c90 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
36ca0 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
36cb0 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
36cc0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
36cd0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
36ce0 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
36cf0 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
36d00 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
36d10 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
36d20 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
36d30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
36d40 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
36d50 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
36d60 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
36d70 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
36d80 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
36d90 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
36da0 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
36db0 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
36dc0 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
36dd0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
36de0 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
36df0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
36e00 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
36e10 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
36e20 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
36e30 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
36e40 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
36e50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
36e60 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
36e70 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
36e80 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
36e90 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
36ea0 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
36eb0 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
36ec0 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
36ed0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
36ee0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
36ef0 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
36f00 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
36f10 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
36f20 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
36f30 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
36f40 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
36f50 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
36f60 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
36f70 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
36f80 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
36f90 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
36fa0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
36fb0 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
36fc0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
36fd0 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
36fe0 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
36ff0 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
37000 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
37010 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
37020 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
37030 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
37040 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
37050 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
37060 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
37070 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
37080 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
37090 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
370a0 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
370b0 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
370c0 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
370d0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
370e0 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
370f0 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
37100 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
37110 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
37120 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
37130 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
37140 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
37150 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
37160 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
37170 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
37180 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
37190 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
371a0 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
371b0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
371c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
371d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
371e0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
371f0 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
37200 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
37210 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
37220 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
37230 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
37240 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
37250 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
37260 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
37270 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
37280 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
37290 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
372a0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
372b0 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
372c0 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
372d0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
372e0 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
372f0 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
37300 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
37310 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
37320 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
37330 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
37340 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
37350 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
37360 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
37370 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
37380 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
37390 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
373a0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
373b0 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
373c0 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
373d0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
373e0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
373f0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
37400 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
37410 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
37420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
37430 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
37440 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
37450 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
37460 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
37470 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
37480 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
37490 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
374a0 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
374b0 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
374c0 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
374d0 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
374e0 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
374f0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
37500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
37510 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
37520 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
37530 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
37540 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
37550 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
37560 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
37570 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
37580 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
37590 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
375a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
375b0 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
375c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
375d0 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
375e0 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
375f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
37600 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
37610 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
37620 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
37630 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
37640 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
37650 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
37660 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
37670 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
37680 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
37690 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
376a0 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
376b0 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
376c0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
376d0 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
376e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
376f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
37700 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
37710 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
37720 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
37730 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
37740 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
37750 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
37760 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
37770 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
37780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37790 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
377a0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
377b0 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
377c0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
377d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
377e0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
377f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
37800 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
37810 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
37820 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
37830 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
37840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37850 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
37860 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
37870 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
37880 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
37890 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
378a0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
378b0 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
378c0 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
378d0 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
378e0 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
378f0 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
37900 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
37910 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
37920 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
37930 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37940 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
37950 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
37960 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
37970 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
37980 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
37990 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
379a0 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
379b0 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
379c0 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
379d0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
379e0 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
379f0 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
37a00 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
37a10 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
37a20 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
37a30 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
37a40 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
37a50 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
37a60 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
37a70 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
37a80 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
37a90 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20  emPage.apOvfl[] 
37aa0 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
37ab0 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
37ac0 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
37ad0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
37ae0 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
37af0 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
37b00 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
37b10 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
37b20 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
37b30 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
37b40 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
37b50 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
37b60 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
37b70 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
37b80 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
37b90 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
37ba0 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
37bb0 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
37bc0 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
37bd0 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
37be0 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
37bf0 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
37c00 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
37c10 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
37c20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
37c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
37c40 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
37c50 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
37c60 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
37c70 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
37c80 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
37c90 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
37ca0 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
37cb0 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
37cc0 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
37cd0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
37ce0 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
37cf0 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
37d00 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b   0);.    int rc;
37d10 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  .    int iData;.
37d20 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74    .  .    assert
37d30 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
37d40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
37d50 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
37d60 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Hdr );.    asser
37d70 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
37d80 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20  om[iFromHdr+5]) 
37d90 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
37da0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
37db0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
37dc0 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
37dd0 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
37de0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
37df0 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
37e00 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
37e10 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
37e20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
37e30 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
37e40 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
37e50 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
37e60 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
37e70 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
37e80 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
37e90 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
37ea0 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
37eb0 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
37ec0 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
37ed0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
37ee0 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
37ef0 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
37f00 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
37f10 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
37f20 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
37f30 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
37f40 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
37f50 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
37f60 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
37f70 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
37f80 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
37f90 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
37fa0 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
37fb0 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
37fc0 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
37fd0 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
37fe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
38000 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
38010 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
38020 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
38030 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
38040 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
38050 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
38060 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
38070 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
38080 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
38090 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
380a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
380b0 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
380c0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
380d0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
380e0 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
380f0 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
38100 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
38110 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
38120 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
38130 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
38140 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
38150 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
38160 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
38170 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
38180 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
38190 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
381a0 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
381b0 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
381c0 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
381d0 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
381e0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
381f0 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
38200 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
38210 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
38220 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
38230 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
38240 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
38250 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
38260 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
38270 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
38280 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
38290 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
382a0 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
382b0 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
382c0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
382d0 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
382e0 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
382f0 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
38300 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
38310 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
38320 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
38330 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
38340 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
38350 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
38360 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
38370 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
38380 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
38390 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
383a0 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
383b0 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
383c0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
383d0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
383e0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
383f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
38400 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
38410 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
38420 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
38430 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
38440 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
38450 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
38460 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
38470 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
38480 68 69 73 20 72 6f 75 7