/ Hex Artifact Content
Login

Artifact 8a4109bdc6993507e95e3b377917a51a33b47027:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
52d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
52e0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
52f0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
5300: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5310: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5320: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
5330: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
5340: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5350: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5360: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5370: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5380: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
53a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
53b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
53d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
53e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
53f0: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
5400: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
5410: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5420: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5430: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5440: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5450: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5460: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5470: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5480: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5490: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
54a0: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54f0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5500: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5510: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5520: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5530: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5540: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5550: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5560: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5570: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5580: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5590: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
55a0: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55b0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55c0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55d0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55e0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55f0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5600: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5610: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5620: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5630: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5640: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5650: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5660: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5670: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5680: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5690: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
56a0: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56b0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
56d0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
56e0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
56f0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5700: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5710: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5720: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5730: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5740: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5750: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5760: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5770: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5780: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5790: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
57a0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
57b0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
57c0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
57d0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
57e0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
57f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5800: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5810: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5820: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5830: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5840: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5850: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5860: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5870: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5880: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5890: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
58a0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
58b0: 70 20 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f  p ? saveCursorsO
58c0: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
58d0: 70 45 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54  pExcept) : SQLIT
58e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
58f0: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
5900: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
5910: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
5920: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
5930: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
5940: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
5950: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
5960: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
5970: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
5980: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
5990: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
59a0: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
59b0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
59c0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
59d0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
59e0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
59f0: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
5a00: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
5a10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5a20: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5a30: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5a40: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
5a50: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
5a60: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
5a70: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
5a80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
5a90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
5aa0: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
5ab0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
5ac0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
5ad0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
5ae0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
5af0: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
5b00: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
5b10: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
5b20: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
5b30: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
5b40: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
5b50: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
5b60: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b70: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5b80: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5b90: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
5ba0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bb0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
5bc0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5be0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5bf0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5c00: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5c10: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5c20: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5c30: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5c40: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5c50: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5c60: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5c70: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5c80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5c90: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ca0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5cb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5cc0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5cd0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5ce0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5cf0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d00: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5d10: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5d20: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5d30: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5d40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5d50: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5d60: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5d70: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5d80: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5d90: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5da0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5db0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5dc0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5dd0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5de0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5df0: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5e00: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5e10: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5e30: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5e40: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5e50: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5e60: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5e70: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5e80: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5e90: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5ea0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5eb0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5ec0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ed0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5ee0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5ef0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5f00: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5f10: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5f20: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5f30: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5f40: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5f60: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5f70: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5f80: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5fa0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5fb0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5fc0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5fd0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5fe0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5ff0: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
6000: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
6010: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
6020: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6030: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6040: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6050: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6060: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6070: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6080: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
6090: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
60a0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
60b0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
60c0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
60d0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
60e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
60f0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6100: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6110: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
6120: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6130: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6140: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6150: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6160: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6180: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6190: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
61a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
61b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
61c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
61d0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
61e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
61f0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6200: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6210: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6220: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6230: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6250: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6260: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6270: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6280: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6290: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
62a0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
62b0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
62c0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
62d0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
62e0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
62f0: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6300: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6310: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6320: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6330: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6340: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6350: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6360: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6370: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6380: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6390: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
63a0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
63b0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
63c0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
63d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
63e0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
63f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
6400: 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61  nt skipNext;.  a
6410: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6420: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6440: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6450: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6460: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6470: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6480: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6490: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
64a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
64b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
64c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
64d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
64e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
64f0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
6500: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6510: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
6520: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6530: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
6540: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
6550: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6560: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6570: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
6580: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
6590: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
65a0: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
65b0: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
65c0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
65d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
65e0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
65f0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
6600: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
6610: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
6620: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
6630: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
6640: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
6650: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
6660: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6670: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
6680: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6690: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
66a0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
66b0: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
66c0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
66d0: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
66e0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
66f0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
6700: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
6710: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
6720: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
6730: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
6740: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
6750: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
6760: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
6770: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
6780: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
6790: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
67a0: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
67b0: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
67c0: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
67d0: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
67e0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
67f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
6800: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
6810: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
6820: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
6830: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
6840: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6850: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
6860: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
6870: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
6880: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
6890: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
68a0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
68b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
68c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
68d0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
68e0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
68f0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6900: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
6910: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6920: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
6930: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
6940: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
6950: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
6960: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
6970: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
6980: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
6990: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
69a0: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
69b0: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
69c0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
69d0: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
69e0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
69f0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
6a00: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
6a10: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
6a20: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
6a30: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
6a40: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
6a50: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
6a60: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
6a70: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
6a80: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
6a90: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
6aa0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
6ab0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
6ac0: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
6ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ae0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
6af0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
6b00: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
6b10: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
6b20: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
6b30: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
6b40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
6b50: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
6b60: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
6b70: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
6b80: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
6b90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
6ba0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6bb0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
6bc0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
6bd0: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
6be0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
6bf0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
6c00: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
6c10: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
6c20: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
6c30: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
6c40: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
6c50: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
6c60: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
6c70: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
6c80: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
6c90: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6ca0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
6cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6cc0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6cd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6ce0: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
6cf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
6d00: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
6d10: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
6d20: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
6d30: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
6d40: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
6d50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
6d60: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
6d70: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
6d80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
6d90: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
6da0: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
6db0: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
6dc0: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
6dd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6de0: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
6df0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
6e00: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
6e10: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
6e20: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
6e30: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
6e40: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
6e50: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
6e60: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
6e70: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
6e80: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
6e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6ea0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6eb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
6ec0: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
6ed0: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
6ee0: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
6ef0: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
6f00: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
6f10: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
6f20: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
6f30: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
6f40: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
6f50: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
6f60: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
6f70: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
6f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
6f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6fa0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6fb0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6fc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6fd0: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6fe0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6ff0: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
7000: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
7010: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
7020: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
7030: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
7040: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
7050: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
7060: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
7070: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
7080: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7090: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
70a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
70b0: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
70c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
70d0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
70e0: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
70f0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
7100: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7110: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7120: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
7130: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
7140: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
7150: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7160: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
7170: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
7180: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7190: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
71a0: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
71b0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
71c0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
71d0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
71e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
71f0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7200: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
7210: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7220: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
7230: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
7240: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
7250: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7260: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7270: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7280: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
7290: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
72a0: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
72b0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
72c0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
72d0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
72e0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
72f0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
7300: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
7310: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
7320: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
7330: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
7340: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7350: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7360: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
7370: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7380: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7390: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
73a0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
73b0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
73c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
73d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
73e0: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
73f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
7400: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7410: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7420: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
7430: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
7440: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7450: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
7460: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
7470: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7480: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7490: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
74a0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
74b0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
74c0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
74d0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
74e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
74f0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
7500: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
7510: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
7520: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
7530: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
7540: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
7550: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
7560: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
7570: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
7580: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
7590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
75a0: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
75b0: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
75c0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
75d0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
75e0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
75f0: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
7600: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7610: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
7620: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
7630: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
7640: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7650: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7660: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
7670: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7680: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
7690: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
76a0: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
76b0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
76c0: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
76d0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
76e0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
76f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
7700: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7710: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7720: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7730: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
7740: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7750: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
7760: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
7770: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7780: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
7790: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
77a0: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
77b0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
77c0: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
77d0: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
77e0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
77f0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
7800: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
7810: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
7820: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
7830: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
7840: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7850: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7860: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7870: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
7880: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7890: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
78a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
78b0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
78c0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
78d0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
78e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
78f0: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
7900: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
7910: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
7920: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
7930: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7940: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
7950: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
7960: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7970: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7980: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
7990: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
79a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
79b0: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
79c0: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
79d0: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
79e0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
79f0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
7a00: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
7a10: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
7a20: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
7a30: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
7a40: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7a50: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
7a60: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
7a70: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
7a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7a90: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
7aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ab0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
7ac0: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
7ad0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
7ae0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7af0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
7b00: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
7b10: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
7b20: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
7b30: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7b40: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
7b50: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
7b60: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
7b70: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
7b80: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
7b90: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
7ba0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
7bb0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
7bc0: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
7bd0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7be0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7bf0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
7c00: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
7c10: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
7c20: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
7c30: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
7c40: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
7c50: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
7c60: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
7c70: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
7c80: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65 6c  2byte(&(P)->aCel
7c90: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a  lIdx[2*(I)])))..
7ca0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
7cb0: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
7cc0: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
7cd0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
7ce0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7cf0: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
7d00: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
7d10: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
7d20: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
7d30: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
7d40: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
7d50: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
7d60: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
7d70: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
7d80: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
7d90: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7db0: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
7dc0: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
7dd0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7de0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7df0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7e00: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e20: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e30: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e40: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e50: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e60: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e70: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
7e80: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
7e90: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
7ea0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
7eb0: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
7ec0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7ed0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7ee0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7ef0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7f00: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
7f10: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
7f20: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
7f30: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
7f40: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
7f50: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
7f60: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
7f70: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
7f80: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
7f90: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
7fa0: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
7fb0: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
7fc0: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
7fd0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
7fe0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
7ff0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
8000: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
8010: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
8020: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
8030: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
8040: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
8050: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
8060: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8070: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
8080: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8090: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
80a0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
80b0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
80c0: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
80d0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
80e0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
80f0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
8100: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
8110: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
8120: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
8130: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
8140: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8150: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8160: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
8170: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8180: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
8190: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
81a0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
81b0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
81c0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
81d0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
81e0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
81f0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8200: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
8210: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
8220: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
8230: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
8240: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
8250: 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50  (u16)(&pInfo->pP
8260: 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c  ayload[pInfo->nL
8270: 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a  ocal] - pCell);.
8280: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8290: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
82a0: 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w + 4;.}../*.** 
82b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
82c0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
82d0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
82e0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
82f0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8300: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8310: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8320: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8330: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8340: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8350: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8360: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8370: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8380: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8390: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
83a0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
83b0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
83c0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
83d0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
83e0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
83f0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8400: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8410: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8420: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8430: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8440: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8450: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8460: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8470: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8480: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8490: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
84a0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
84b0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
84c0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
84e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
84f0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8500: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8510: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8520: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8530: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8540: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8550: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8560: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8570: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8580: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8590: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
85a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
85b0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
85c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61  ert( pPage->noPa
85d0: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
85e0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
85f0: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70  trSize==4 );.  p
8600: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
8610: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
8620: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
8630: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
8640: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
8650: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
8660: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
8670: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
8680: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
8690: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
86a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
86b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
86c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
86d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
86e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
86f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8700: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8710: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8720: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8730: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8740: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8750: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8760: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8770: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
8780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
8790: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
87a0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
87b0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
87c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
87d0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
87e0: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
87f0: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
8800: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
8810: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
8820: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8830: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8840: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8850: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8860: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
8870: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
8880: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8890: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c 7c 20 70  >intKeyLeaf || p
88a0: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
88b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
88c0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
88d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
88e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
88f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8900: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8910: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
8920: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
8930: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8940: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8950: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8960: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8970: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
8980: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
8990: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
89a0: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
89b0: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
89c0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
89d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
89e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
89f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8a00: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
8a10: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
8a20: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8a30: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
8a40: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
8a50: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
8a60: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
8a70: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
8a80: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
8a90: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
8aa0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
8ab0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
8ac0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
8ad0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
8ae0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
8af0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
8b00: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
8b10: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
8b20: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
8b30: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
8b40: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
8b50: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
8b60: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
8b70: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
8b80: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
8b90: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
8ba0: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
8bb0: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
8bc0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8bd0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
8be0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
8bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
8c00: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
8c10: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
8c20: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
8c30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
8c60: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
8c70: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
8c80: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8c90: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8ca0: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8cb0: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8cc0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8cd0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8ce0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
8cf0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
8d00: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
8d10: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
8d20: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8d30: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8d40: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8d50: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8d60: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8d70: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8d80: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8d90: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8da0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8db0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8dc0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8dd0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8de0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
8df0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
8e00: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
8e10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8e20: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8e30: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8e40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8e50: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
8e60: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
8e70: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
8e80: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
8e90: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
8ea0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8eb0: 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65  Index(.  MemPage
8ec0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8ed0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8ee0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8ef0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8f10: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8f20: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8f30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8f40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8f50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8f60: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f80: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
8f90: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
8fa0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
8fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8fc0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
8fd0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  ell payload */..
8fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9000: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9020: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9030: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9040: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9050: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20  ->intKeyLeaf==0 
9060: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9070: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
9080: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9090: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
90a0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
90b0: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
90c0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
90d0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
90e0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
90f0: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
9100: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
9110: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
9120: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
9130: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
9140: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
9150: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
9160: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9170: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
9180: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
9190: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
91a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
91b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
91c0: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
91d0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
91e0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
91f0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
9200: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9210: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9220: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
9230: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9240: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9250: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9260: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9270: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9280: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9290: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
92a0: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
92b0: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
92c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
92d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
92e0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
92f0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
9300: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
9310: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
9320: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
9330: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9340: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
9350: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
9360: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9370: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9380: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9390: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
93a0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
93b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
93c0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
93d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
93e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
93f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9400: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
9410: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9420: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
9430: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
9440: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
9450: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9460: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9470: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9480: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
9490: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
94a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
94b0: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
94c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
94d0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
94e0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
94f0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
9500: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
9510: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
9520: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
9530: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
9540: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
9550: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9560: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
9570: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
9580: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
9590: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
95a0: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
95b0: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
95c0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
95d0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
95e0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
95f0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
9600: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
9610: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
9620: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
9630: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
9640: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
9650: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
9660: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
9670: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
9680: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
9690: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
96a0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
96b0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
96c0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
96d0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
96e0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
96f0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
9700: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
9710: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
9740: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
9750: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
9760: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
9790: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
97a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
97b0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
97c0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
97d0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
97e0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
97f0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
9800: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
9810: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
9820: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
9830: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
9840: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
9850: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
9860: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
9870: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
9880: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
9890: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
98a0: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
98b0: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
98c0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
98d0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
98e0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
98f0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
9900: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
9910: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9920: 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a  noPayload==0 );.
9930: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
9940: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
9950: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
9960: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9970: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
9980: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
9990: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
9a00: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
9a10: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
9a20: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
9a30: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
9a40: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
9a50: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
9a60: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
9a70: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
9a80: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
9a90: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
9aa0: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
9ab0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
9ac0: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
9ad0: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
9ae0: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
9af0: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
9b00: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9b10: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
9b20: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9b30: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9b40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9b50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9b60: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
9b70: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9b80: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
9b90: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9ba0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
9bb0: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
9bd0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
9be0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
9bf0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
9c00: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
9c10: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
9c20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9c30: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9c40: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
9c50: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
9c60: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
9c70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9c80: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
9c90: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
9ca0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
9cb0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
9cc0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
9cd0: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
9ce0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
9cf0: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
9d00: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
9d10: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
9d20: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
9d30: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
9d40: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
9d50: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
9d60: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9d70: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9d80: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
9d90: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9da0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9db0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9dd0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
9de0: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
9df0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9e00: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9e10: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
9e20: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
9e30: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
9e40: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
9e50: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
9e60: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
9e70: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
9e80: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
9e90: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
9ea0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
9eb0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
9ec0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
9ed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
9ee0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
9ef0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
9f00: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
9f10: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
9f20: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
9f30: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
9f40: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
9f50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
9f60: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9f70: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
9f80: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
9f90: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
9fa0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
9fb0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
9fc0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
9fd0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
9fe0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
9ff0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a000: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a010: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a020: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a030: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
a040: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
a050: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
a060: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
a070: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
a080: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
a090: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
a0a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a0b0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
a0c0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
a0d0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
a0e0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
a0f0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
a100: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a110: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
a120: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
a130: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
a140: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
a150: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
a160: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
a170: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
a180: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
a190: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
a1a0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
a1b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a1c0: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
a1d0: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a1e0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
a1f0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
a200: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
a210: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
a220: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
a230: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
a240: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a250: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
a260: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
a270: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
a280: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
a290: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
a2a0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
a2b0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
a2c0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
a2d0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
a2e0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
a2f0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
a300: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
a310: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
a320: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
a330: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
a340: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
a350: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
a360: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
a370: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
a380: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
a390: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a3a0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
a3b0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
a3c0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
a3d0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a  ntent area..**.*
a3e0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
a3f0: 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c  -44582-60138 SQL
a400: 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d  ite may from tim
a410: 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61  e to time reorga
a420: 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65  nize a.** b-tree
a430: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
a440: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62  ere are no freeb
a450: 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e  locks or fragmen
a460: 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20  t bytes, all.** 
a470: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65  unused bytes are
a480: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
a490: 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70  e unallocated sp
a4a0: 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20  ace region, and 
a4b0: 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65  all.** cells are
a4c0: 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20   packed tightly 
a4d0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a4e0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
a4f0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
a500: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
a510: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a540: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
a570: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
a580: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5a0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a5b0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
a5c0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a5e0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a5f0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
a600: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a610: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
a620: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
a630: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
a640: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
a650: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
a660: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a670: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
a680: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
a690: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a6a0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
a6b0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a6c0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
a6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a6e0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
a6f0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
a700: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a710: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
a720: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
a730: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
a740: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
a750: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
a760: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
a770: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
a780: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
a790: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
a7a0: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a7c0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
a7d0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
a7e0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
a7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
a800: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
a810: 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73  index */...  ass
a820: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
a830: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a840: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a860: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a870: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
a880: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
a890: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a8a0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
a8b0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
a8c0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
a8d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a8e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a8f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
a900: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
a910: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
a920: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
a930: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a940: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
a950: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
a960: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
a970: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
a980: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
a990: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
a9a0: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
a9b0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
a9c0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
a9d0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
a9e0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
a9f0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
aa00: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
aa10: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
aa20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
aa30: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
aa40: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
aa50: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
aa60: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
aa70: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
aa80: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
aa90: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
aaa0: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
aab0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
aac0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
aad0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
aae0: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20  lLast );.    /* 
aaf0: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
ab00: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
ab10: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
ab20: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
ab30: 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20     ** if PRAGMA 
ab40: 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d  cell_size_check=
ab50: 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ON..    */.    i
ab60: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
ab70: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
ab80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ab90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
aba0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
abb0: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
abc0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
abd0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
abe0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
abf0: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
ac00: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
ac10: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
ac20: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
ac30: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
ac40: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
ac50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ac60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ac70: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ac80: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
ac90: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
aca0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
acb0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
acc0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
acd0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ace0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
acf0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
ad00: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
ad10: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
ad20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
ad30: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
ad40: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
ad50: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
ad60: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
ad70: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
ad80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
ad90: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
ada0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
adb0: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
adc0: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
add0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
ade0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
adf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
ae00: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
ae10: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
ae20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
ae30: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
ae40: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
ae50: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
ae60: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
ae70: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
ae80: 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +2] = 0;.  data[
ae90: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+7] = 0;.  me
aea0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
aeb0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
aec0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
aed0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
aee0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
aef0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
af00: 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65  ;.  if( cbrk-iCe
af10: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
af20: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
af30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af40: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
af50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
af60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
af70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
af80: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
af90: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
afa0: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
afb0: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
afc0: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
afd0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
afe0: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
aff0: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
b000: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
b010: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
b020: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
b030: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
b040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
b050: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
b060: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b070: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
b080: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
b090: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
b0a0: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
b0b0: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
b0c0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
b0d0: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
b0e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
b0f0: 66 20 61 20 73 6c 6f 74 20 6f 66 20 61 74 20 6c  f a slot of at l
b100: 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73  east nByte bytes
b110: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 63 61   is found but ca
b120: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62 65 63  nnot be used bec
b130: 61 75 73 65 20 0a 2a 2a 20 74 68 65 72 65 20 61  ause .** there a
b140: 72 65 20 61 6c 72 65 61 64 79 20 61 74 20 6c 65  re already at le
b150: 61 73 74 20 36 30 20 66 72 61 67 6d 65 6e 74 65  ast 60 fragmente
b160: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b170: 61 67 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  age, return NULL
b180: 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
b190: 65 2c 20 69 66 20 70 62 44 65 66 72 61 67 20 70  e, if pbDefrag p
b1a0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
b1b0: 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 44 65 66  NULL, set *pbDef
b1c0: 72 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  rag to true..*/.
b1d0: 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46  static u8 *pageF
b1e0: 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20  indSlot(MemPage 
b1f0: 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c  *pPg, int nByte,
b200: 20 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 2a   int *pRc, int *
b210: 70 62 44 65 66 72 61 67 29 7b 0a 20 20 63 6f 6e  pbDefrag){.  con
b220: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
b230: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
b240: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
b250: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
b260: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 69 6e 74  int iAddr;.  int
b270: 20 70 63 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c   pc;.  int usabl
b280: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
b290: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
b2a0: 20 66 6f 72 28 69 41 64 64 72 3d 68 64 72 2b 31   for(iAddr=hdr+1
b2b0: 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65  ; (pc = get2byte
b2c0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 29  (&aData[iAddr]))
b2d0: 3e 30 3b 20 69 41 64 64 72 3d 70 63 29 7b 0a 20  >0; iAddr=pc){. 
b2e0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
b2f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b300: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
b310: 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   */.    /* EVIDE
b320: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d  NCE-OF: R-06866-
b330: 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73  39125 Freeblocks
b340: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e   are always conn
b350: 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f  ected in order o
b360: 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73  f.    ** increas
b370: 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20  ing offset. */. 
b380: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
b390: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64  Size-4 || pc<iAd
b3a0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70  dr+4 ){.      *p
b3b0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
b3c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b3d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
b3e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
b3f0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
b400: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
b410: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
b420: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
b430: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
b440: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
b450: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
b460: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
b470: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
b480: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
b490: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
b4a0: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
b4b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
b4c0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  c+2]);.    if( s
b4d0: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
b4e0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
b4f0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
b500: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
b510: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b520: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
b530: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
b540: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
b550: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
b560: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
b570: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
b580: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b590: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  KPT;.        ret
b5a0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
b5b0: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
b5c0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
b5d0: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
b5e0: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
b5f0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
b600: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
b610: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
b620: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
b630: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
b640: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
b650: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
b660: 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20  7]>=60 ){.      
b670: 20 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67      if( pbDefrag
b680: 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31   ) *pbDefrag = 1
b690: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
b6a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
b6c0: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
b6d0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
b6e0: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
b6f0: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
b700: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
b710: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
b720: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
b730: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
b740: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
b750: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
b760: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
b770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b780: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
b790: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
b7a0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
b7b0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
b7c0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
b7d0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
b7e0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
b7f0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
b800: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
b810: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
b820: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
b830: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
b840: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
b850: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
b860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
b870: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
b880: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
b890: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
b8a0: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
b8b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
b8c0: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
b8d0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
b8e0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
b8f0: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
b900: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
b910: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
b920: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
b930: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
b940: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
b950: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
b960: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
b970: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
b980: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
b990: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
b9a0: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
b9b0: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
b9c0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
b9d0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
b9e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
b9f0: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
ba00: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
ba10: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
ba20: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
ba30: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
ba40: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
ba50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
ba60: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
ba70: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
ba80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
ba90: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
baa0: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
bab0: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
bac0: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
bad0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
bae0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
baf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
bb00: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
bb10: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
bb20: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
bb30: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
bb40: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
bb50: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
bb60: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
bb70: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
bb80: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
bb90: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bba0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
bbb0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
bbc0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
bbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bbf0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
bc00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bc10: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bc20: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bc40: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
bc50: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
bc60: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bc70: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
bc80: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
bc90: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
bca0: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
bcb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
bcc0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
bcd0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bce0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
bcf0: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
bd00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bd10: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
bd20: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
bd30: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
bd40: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
bd50: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
bd60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
bd70: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
bd80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
bd90: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
bda0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
bdb0: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
bdc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
bdd0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
be00: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
be10: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
be20: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
be30: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
be40: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
be50: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
be60: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
be70: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
be80: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
be90: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
bea0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
beb0: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
bec0: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
bed0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
bee0: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
bef0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
bf00: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
bf10: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
bf20: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
bf30: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
bf40: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
bf50: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
bf60: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
bf70: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
bf80: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
bf90: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
bfa0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
bfb0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
bfc0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
bfd0: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
bfe0: 3e 74 6f 70 20 7c 7c 20 28 75 33 32 29 74 6f 70  >top || (u32)top
bff0: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
c000: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  bleSize ){.    r
c010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c020: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
c030: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
c040: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
c050: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
c060: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
c070: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
c080: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
c090: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
c0a0: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
c0b0: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
c0c0: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
c0d0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
c0e0: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
c0f0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
c100: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
c110: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
c120: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
c130: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
c140: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
c150: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
c160: 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f  .  if( gap+2<=to
c170: 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31  p && (data[hdr+1
c180: 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] || data[hdr+2]
c190: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 65  ) ){.    int bDe
c1a0: 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75 38  frag = 0;.    u8
c1b0: 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46   *pSpace = pageF
c1c0: 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e  indSlot(pPage, n
c1d0: 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65 66  Byte, &rc, &bDef
c1e0: 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rag);.    if( rc
c1f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c200: 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29 20    if( bDefrag ) 
c210: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c220: 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 53  page;.    if( pS
c230: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
c240: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
c250: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
c260: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
c270: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
c280: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
c290: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c2a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
c2b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
c2c0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
c2d0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
c2e0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
c2f0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
c300: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
c310: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
c320: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
c330: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
c340: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
c350: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
c360: 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d 65  top ){. defragme
c370: 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73 73  nt_page:.    ass
c380: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
c390: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
c3a0: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
c3b0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
c3c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
c3d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c3e0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
c3f0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
c400: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
c410: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
c420: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
c430: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
c440: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
c450: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
c460: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
c470: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
c480: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
c490: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
c4a0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
c4b0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
c4c0: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
c4d0: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
c4e0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
c4f0: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
c500: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
c510: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
c520: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
c530: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
c540: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
c550: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
c560: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
c570: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
c580: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
c590: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c5a0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
c5b0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
c5c0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
c5d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c5e0: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
c5f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c600: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
c610: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
c620: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
c630: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
c640: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
c650: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
c660: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
c670: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
c680: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
c690: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
c6a0: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
c6b0: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
c6c0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
c6d0: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
c6e0: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
c6f0: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
c700: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
c710: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
c720: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
c730: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
c740: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
c750: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
c760: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
c770: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
c780: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
c790: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
c7a0: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
c7b0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
c7c0: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
c7d0: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
c7e0: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
c7f0: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
c800: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
c810: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
c820: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c830: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
c840: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
c850: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
c860: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
c870: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
c880: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
c890: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
c8c0: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
c8d0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
c8e0: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
c910: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
c920: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c950: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
c960: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
c970: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
c9a0: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
c9b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
c9c0: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
c9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9e0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
c9f0: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
ca00: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
ca10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ca20: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
ca30: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
ca40: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
ca50: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
ca60: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
ca70: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
ca80: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
ca90: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
caa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cab0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
cac0: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
cad0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
cae0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
caf0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
cb00: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
cb10: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
cb20: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
cb30: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
cb40: 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  || iStart>=pPage
cb50: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
cb60: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
cb70: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
cb80: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
cb90: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
cba0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
cbb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cbc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
cbd0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
cbf0: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
cc00: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
cc10: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
cc20: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
cc30: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
cc40: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
cc50: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
cc60: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
cc70: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
cc80: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
cc90: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
cca0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
ccb0: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
ccc0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
ccd0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
cce0: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
ccf0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
cd00: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
cd10: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
cd20: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
cd30: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
cd40: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
cd50: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
cd60: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
cd70: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
cd80: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
cd90: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
cda0: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
cdb0: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
cdc0: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
cdd0: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
cde0: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
cdf0: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
ce00: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
ce10: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
ce20: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
ce30: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
ce40: 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c  ]))>0 && iFreeBl
ce50: 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  k<iStart ){.    
ce60: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
ce70: 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53  Ptr+4 ) return S
ce80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ce90: 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d  PT;.      iPtr =
cea0: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
ceb0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
cec0: 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e  k>iLast ) return
ced0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cee0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
cef0: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
cf00: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
cf10: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
cf20: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
cf30: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
cf40: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
cf50: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
cf60: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
cf70: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
cf80: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
cf90: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
cfa0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
cfb0: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
cfc0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
cfd0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
cfe0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
cff0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
d000: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
d010: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
d020: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
d030: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
d040: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
d050: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
d060: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
d070: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d080: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
d090: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
d0a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
d0b0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
d0c0: 4e 45 56 45 52 28 69 45 6e 64 20 3e 20 70 50 61  NEVER(iEnd > pPa
d0d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d0e0: 69 7a 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ize) ) return SQ
d0f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d100: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
d110: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
d120: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
d130: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d140: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
d150: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
d160: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
d170: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
d180: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
d190: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
d1a0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
d1b0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
d1c0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
d1d0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
d1e0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
d1f0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
d200: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
d210: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
d220: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
d230: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
d240: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
d250: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
d260: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
d270: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
d280: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
d290: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
d2a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d2b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
d2c0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
d2d0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
d2e0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
d2f0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
d300: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
d310: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d320: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
d330: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
d340: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d350: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
d360: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
d370: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
d380: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
d390: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
d3a0: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
d3b0: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
d3c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
d3d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d3e0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
d3f0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
d400: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
d410: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
d420: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
d430: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
d440: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
d450: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
d460: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d470: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
d480: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
d490: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
d4a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d4b0: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
d4c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
d4d0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
d4e0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
d4f0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
d500: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d510: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
d520: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
d530: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
d540: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
d550: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
d560: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
d570: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
d580: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
d590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
d5b0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
d5c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
d5d0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
d5e0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
d5f0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
d600: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
d610: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
d620: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
d630: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
d640: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
d650: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
d660: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
d670: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
d680: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
d690: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
d6a0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
d6b0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
d6c0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
d6d0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
d6e0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
d6f0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
d700: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
d710: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
d720: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
d730: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
d740: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
d750: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
d760: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d770: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
d780: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
d790: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
d7a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
d7b0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
d7c0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
d7d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d7e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d7f0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d800: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
d810: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
d820: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
d830: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
d840: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
d850: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
d860: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d870: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
d880: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
d890: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
d8a0: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
d8b0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
d8c0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
d8d0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
d8e0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
d8f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
d900: 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75  640-13415 A valu
d910: 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65  e of 5 means the
d920: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
d930: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rior.    ** tabl
d940: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
d950: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
d960: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
d970: 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20  INTKEY)==5 );.  
d980: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d990: 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20  : R-20501-61796 
d9a0: 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65  A value of 13 me
d9b0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
d9c0: 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61  a leaf.    ** ta
d9d0: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
d9e0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d9f0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
da00: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
da10: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
da20: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
da30: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
da40: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
da50: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
da60: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
da70: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b  ->noPayload = 0;
da80: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
da90: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
daa0: 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20  ParseCellPtr;.  
dab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
dac0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
dad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
dae0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31  e->noPayload = 1
daf0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
db00: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
db10: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
db20: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
db30: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
db40: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
db50: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
db60: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
db70: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
db80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
db90: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
dba0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
dbb0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
dbc0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
dbd0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
dbe0: 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76  -27225-53936 A v
dbf0: 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
dc00: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69  the page is an i
dc10: 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69  nterior.    ** i
dc20: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
dc30: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
dc40: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d   (PTF_ZERODATA)=
dc50: 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =2 );.    /* EVI
dc60: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37  DENCE-OF: R-1657
dc70: 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20  1-11615 A value 
dc80: 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20  of 10 means the 
dc90: 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20  page is a leaf. 
dca0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
dcb0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
dcc0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
dcd0: 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
dce0: 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
dcf0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
dd00: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
dd10: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
dd20: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20  ge->noPayload = 
dd30: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
dd40: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
dd50: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
dd60: 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
dd70: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
dd80: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
dd90: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
dda0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
ddb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
ddc0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
ddd0: 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
dde0: 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
ddf0: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
de00: 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
de10: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
de20: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de30: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
de40: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
de50: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
de60: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
de70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
de80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
de90: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
dea0: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
deb0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
dec0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
ded0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
dee0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
def0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
df00: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
df10: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
df20: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
df30: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
df40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
df50: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
df60: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
df70: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
df80: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
df90: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
dfa0: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
dfb0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
dfc0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
dfd0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
dfe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
dff0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
e000: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
e010: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e020: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e030: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
e040: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e060: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e070: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e080: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
e090: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e0a0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
e0b0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
e0c0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
e0d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
e0e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e0f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e100: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
e110: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
e120: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
e130: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
e140: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
e150: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
e160: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e170: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
e180: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
e190: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
e1a0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
e1b0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
e1c0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
e1d0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
e1e0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
e1f0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
e200: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
e210: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
e220: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
e230: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
e240: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
e250: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
e260: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
e270: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e280: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
e290: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
e2a0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
e2b0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
e2c0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
e2d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
e2e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
e2f0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
e300: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
e310: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e330: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
e340: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e350: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
e360: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
e370: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
e380: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e390: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
e3a0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
e3b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
e3c0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
e3d0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
e3e0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
e3f0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
e400: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
e410: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
e420: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
e430: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e440: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
e450: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
e460: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
e470: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
e480: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
e490: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
e4a0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
e4b0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
e4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e4d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
e4e0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
e4f0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
e500: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
e510: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
e520: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
e530: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e540: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
e550: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
e560: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
e570: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
e580: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
e590: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
e5a0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
e5b0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e5c0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
e5d0: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
e5e0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
e5f0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
e600: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
e610: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
e620: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
e630: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
e640: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
e650: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
e660: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
e670: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
e680: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
e690: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
e6a0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
e6b0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
e6c0: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
e6d0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
e6e0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
e6f0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
e700: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
e710: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
e720: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
e730: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
e740: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
e750: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
e760: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
e770: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
e780: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e790: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
e7a0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
e7b0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
e7c0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
e7d0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
e7e0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
e7f0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
e800: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e820: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
e830: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
e840: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
e850: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
e860: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
e870: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
e880: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
e890: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
e8a0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
e8b0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
e8c0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
e8d0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
e8e0: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
e8f0: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
e900: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
e910: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
e920: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
e930: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
e940: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
e950: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
e960: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e970: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
e980: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
e990: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
e9a0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
e9b0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
e9c0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
e9d0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
e9e0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
e9f0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
ea00: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
ea10: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
ea20: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
ea30: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
ea40: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
ea50: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
ea60: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
ea70: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ea80: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ea90: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
eaa0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
eab0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
eac0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
ead0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
eae0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
eaf0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
eb00: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
eb10: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62  .    if( pBt->db
eb20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
eb30: 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20  _CellSizeCk ){. 
eb40: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
eb50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
eb60: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
eb70: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
eb80: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
eb90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
eba0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
ebb0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
ebc0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
ebd0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
ebe0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
ebf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ec00: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
ec10: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
ec20: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
ec30: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
ec40: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
ec50: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
ec60: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
ec70: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
ec80: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
ec90: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
eca0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ecb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ecc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ecd0: 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
ece0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
ecf0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
ed00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
ed10: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
ed20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
ed30: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
ed40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ed60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
ed70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ed80: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
ed90: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
eda0: 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
edb0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
edc0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
edd0: 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
ede0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
edf0: 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
ee00: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
ee10: 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
ee20: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
ee30: 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
ee40: 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
ee50: 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
ee60: 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
ee70: 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
ee80: 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
ee90: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
eea0: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
eeb0: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
eec0: 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
eed0: 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
eee0: 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
eef0: 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
ef00: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
ef10: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
ef20: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
ef30: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
ef40: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
ef50: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ef60: 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
ef70: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
ef80: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
ef90: 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
efa0: 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
efb0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
efc0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
efd0: 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
efe0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
eff0: 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c  * Or, the freebl
f000: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65  ock is off the e
f010: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  nd of the page. 
f020: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f040: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
f060: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
f070: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
f080: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
f090: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
f0a0: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
f0b0: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
f0c0: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
f0d0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
f0e0: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
f0f0: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
f100: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
f110: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
f120: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
f130: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
f140: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
f150: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
f160: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f170: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f180: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
f190: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
f1a0: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
f1b0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
f1c0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
f1d0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
f1e0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
f1f0: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
f200: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
f210: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
f220: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
f230: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
f240: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
f250: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
f260: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
f270: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
f280: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
f290: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
f2a0: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
f2b0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
f2c0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
f2d0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
f2e0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
f2f0: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
f300: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
f310: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
f320: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
f330: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
f340: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
f350: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
f360: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
f370: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
f380: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
f390: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f3a0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
f3b0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
f3c0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
f3d0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
f3e0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
f3f0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
f400: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f410: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
f420: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
f430: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
f440: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
f450: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
f460: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
f470: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
f480: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
f490: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
f4a0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
f4b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
f4c0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f4d0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
f4e0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
f4f0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
f500: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
f510: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
f520: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
f530: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
f540: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
f550: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
f560: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
f570: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
f580: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
f590: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f5a0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
f5b0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
f5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
f5d0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
f5e0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
f5f0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
f600: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f610: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
f620: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
f630: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
f640: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
f650: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
f660: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
f670: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
f680: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
f690: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
f6a0: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
f6b0: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
f6c0: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
f6d0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
f6e0: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
f6f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
f700: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
f710: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
f720: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
f730: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
f740: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
f750: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
f760: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
f770: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
f780: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
f790: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
f7a0: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
f7b0: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
f7c0: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
f7d0: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
f7e0: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
f7f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
f800: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
f810: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
f820: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
f830: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
f840: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
f850: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f860: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
f870: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
f880: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
f890: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
f8a0: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
f8b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
f8c0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
f8d0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
f8e0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
f8f0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
f900: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
f910: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
f920: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
f930: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
f940: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
f950: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
f960: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
f970: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
f980: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
f990: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f9a0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
f9b0: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
f9c0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
f9d0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
f9e0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
f9f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fa00: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
fa10: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
fa20: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
fa30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
fa40: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
fa50: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
fa60: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
fa70: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
fa80: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
fa90: 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
faa0: 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
fab0: 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
fac0: 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
fad0: 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
fae0: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
faf0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
fb00: 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
fb10: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
fb20: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
fb30: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
fb40: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
fb50: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
fb60: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
fb70: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
fb80: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
fb90: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
fba0: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
fbb0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
fbc0: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
fbd0: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
fbe0: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
fbf0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
fc00: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
fc10: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
fc20: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
fc30: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
fc40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
fc50: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
fc60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
fc70: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
fc80: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
fc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fca0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
fcb0: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
fcc0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
fcd0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
fce0: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
fcf0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
fd00: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
fd10: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
fd20: 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
fd30: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
fd40: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
fd50: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
fd60: 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
fd70: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
fd80: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
fd90: 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
fda0: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
fdb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fdc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fdd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fde0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fdf0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
fe00: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
fe10: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
fe20: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
fe30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
fe40: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
fe50: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
fe60: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
fe70: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
fe80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
fe90: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
fea0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
feb0: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
fec0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
fed0: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
fee0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
fef0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
ff00: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
ff10: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
ff20: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
ff30: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
ff40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
ff50: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
ff60: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
ff70: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
ff80: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
ff90: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
ffa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ffb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
ffc0: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
ffd0: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
ffe0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
fff0: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
10000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
10010 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
10020 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
10030 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10040 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10050 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10060 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10070 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10080 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10090 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
100a0 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
100b0 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
100c0 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
100d0 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
100e0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
100f0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
10100 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
10110 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
10120 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
10130 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10140 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10150 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10160 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10170 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10180 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10190 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
101a0 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
101b0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
101c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
101d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
101e0 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
101f0 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
10200 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
10210 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
10220 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
10230 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
10240 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10250 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
10260 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
10270 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
10280 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
10290 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
102a0 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
102b0 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
102c0 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
102d0 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
102e0 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
102f0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10320 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10350 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
10360 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
10370 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
10380 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10390 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
103a0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
103b0 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
103c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
103d0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
103e0 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e   or 0 */.){.  in
103f0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
10400 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10410 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
10420 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52 65 61  ;.  assert( bRea
10430 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54  donly==PAGER_GET
10440 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65  _READONLY || bRe
10450 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adonly==0 );..  
10460 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
10470 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
10480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10490 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
104a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
104b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
104c0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
104d0 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  bReadonly);.    
104e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
104f0 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
10500 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
10510 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
10520 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
10530 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10550 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
10560 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ppPage);.      }
10570 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65  .    }.  }..  te
10580 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
10590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
105a0 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
105b0 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
105c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
105d0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
105e0 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
105f0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
10600 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
10610 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
10620 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
10630 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
10640 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
10650 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
10660 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
10670 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
10680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
10690 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
106a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
106b0 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  DbPage!=0 );.   
106c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
106d0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
106e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
106f0 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10700 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
10710 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10720 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10730 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
10740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
10750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10760 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
10770 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
10780 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
10790 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ull(pPage->pDbPa
107a0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
107b0 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
107c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
107d0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
107e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
107f0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
10800 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
10810 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
10820 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
10830 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
10840 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
10850 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
10860 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
10870 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
10880 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
10890 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
108a0 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
108b0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
108c0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
108d0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
108e0 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
108f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
10900 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
10920 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
10930 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10940 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
10950 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
10960 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
10970 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
10990 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
109a0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
109b0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
109c0 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
109d0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
109e0 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
109f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
10a10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
10a20 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
10a30 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
10a40 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10a50 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
10a60 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
10a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10a80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
10aa0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
10ab0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10ac0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
10ad0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10ae0 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
10af0 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
10b00 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
10b10 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
10b20 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
10b30 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
10b40 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
10b50 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
10b60 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
10b70 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
10b80 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
10b90 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
10ba0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10bb0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
10bc0 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
10bd0 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
10be0 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
10bf0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10c00 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
10c10 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
10c20 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
10c30 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
10c40 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
10c50 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
10c60 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
10c70 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
10c80 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
10c90 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
10ca0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
10cb0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
10cc0 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
10cd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
10ce0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10cf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
10d00 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
10d10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
10d20 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
10d30 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
10d40 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
10d50 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
10d60 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
10d70 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
10d80 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
10d90 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
10da0 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
10db0 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
10dc0 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
10dd0 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
10de0 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
10df0 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
10e00 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
10e10 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
10e20 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
10e30 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
10e40 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
10e50 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
10e60 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
10e70 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
10e80 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
10e90 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
10ea0 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
10eb0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
10ec0 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
10ed0 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
10ee0 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
10ef0 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
10f00 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
10f10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10f20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
10f30 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
10f40 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
10f50 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
10f60 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
10f70 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
10f80 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
10f90 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
10fa0 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
10fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10fc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10fd0 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
10fe0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
10ff0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
11000 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
11010 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
11020 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
11030 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
11040 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
11050 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
11060 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
11070 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
11080 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
11090 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
110a0 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
110b0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
110c0 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
110d0 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
110e0 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
110f0 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
11100 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
11110 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
11120 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
11130 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
11140 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
11150 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
11160 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11170 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
11180 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
11190 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
111a0 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
111b0 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
111c0 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
111d0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
111e0 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
111f0 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
11200 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
11210 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
11220 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
11230 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
11240 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
11250 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
11260 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
11270 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
11280 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
11290 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
112a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
112b0 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
112c0 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
112d0 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
112e0 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
112f0 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
11300 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
11310 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
11320 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
11330 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
11340 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
11350 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
11360 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
11370 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
11380 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
11390 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
113a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
113b0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
113c0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
113d0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
113e0 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
113f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11400 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
11410 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
11420 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
11430 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
11440 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
11460 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
11470 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
11480 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
11490 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
114a0 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
114b0 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
114c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114e0 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
114f0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
11500 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
11510 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
11520 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
11530 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
11540 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
11550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11560 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
11570 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
11580 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
115b0 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
115c0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
115d0 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
115e0 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
115f0 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
11600 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
11610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
11620 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
11630 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
11640 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
11650 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11670 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
11680 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
11690 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
116a0 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
116b0 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
116c0 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
116d0 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
116e0 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
116f0 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
11700 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
11710 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
11720 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
11730 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
11740 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
11750 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
11760 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
11770 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
11780 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
11790 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
117a0 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
117b0 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
117c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
117d0 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
117e0 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
117f0 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
11800 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
11810 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
11820 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
11830 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
11860 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
11870 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
118a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
118b0 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
118c0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
118d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
118e0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
118f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11900 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
11910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
11920 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
11930 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
11940 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
11950 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
11960 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
11970 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
11980 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
11990 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
119a0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
119b0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
119c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
119d0 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
119e0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
119f0 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
11a00 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
11a10 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
11a20 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
11a30 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
11a40 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
11a50 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
11a60 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
11a70 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
11a80 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
11a90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
11aa0 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
11ab0 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
11ac0 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
11ad0 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
11ae0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
11af0 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
11b00 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
11b10 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
11b20 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
11b30 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
11b40 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
11b50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11b60 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
11b70 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
11b80 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
11b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ba0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
11bb0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
11bc0 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
11bd0 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
11be0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11bf0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11c00 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
11c10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11c20 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
11c30 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
11c40 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
11c50 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
11c60 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
11c70 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
11c80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
11c90 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
11ca0 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
11cb0 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
11cc0 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
11cd0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
11ce0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
11cf0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
11d00 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
11d10 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
11d20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
11d30 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
11d40 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
11d50 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
11d60 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
11d70 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
11d80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
11d90 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
11da0 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
11db0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
11dc0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
11dd0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
11de0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
11df0 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
11e00 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
11e10 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
11e20 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
11e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11e40 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
11e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11e60 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
11e70 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
11e80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
11e90 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
11ea0 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
11eb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
11ec0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
11ed0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
11ee0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
11ef0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
11f20 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
11f30 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
11f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11f60 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
11f70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11f80 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
11f90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11fa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11fb0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
11fc0 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
11fd0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
11fe0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
11ff0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12000 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
12010 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12020 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
12030 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
12040 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
12050 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
12060 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
12070 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12080 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12090 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
120a0 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
120b0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
120c0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
120d0 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
120e0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
120f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12100 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
12110 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
12120 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
12130 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
12140 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
12150 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
12160 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
12170 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
12180 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
12190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
121a0 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
121b0 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
121c0 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
121d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
121e0 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
121f0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
12200 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
12210 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
12220 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
12230 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
12240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12250 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
12260 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
12270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12280 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
12290 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
122a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
122b0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
122c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
122d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
122f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
12300 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
12310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12320 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
12330 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
12340 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
12350 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
12360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12370 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12380 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12390 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
123a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
123b0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
123c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
123d0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
123e0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
123f0 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
12400 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
12410 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
12420 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
12430 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
12440 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
12450 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
12460 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
12470 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
12480 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
12490 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
124a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
124b0 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
124c0 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
124d0 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
124e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
124f0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12500 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
12510 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
12520 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
12530 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
12540 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
12550 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
12560 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
12570 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
12580 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
12590 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
125a0 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
125b0 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
125c0 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
125d0 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
125e0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
125f0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
12600 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
12610 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
12620 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
12630 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
12640 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
12650 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
12660 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
12670 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
12680 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
12690 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
126a0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
126b0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
126c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
126d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
126e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
126f0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
12700 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
12710 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12720 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
12730 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
12740 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
12770 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
12780 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
12790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
127a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
127b0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
127c0 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
127d0 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
127e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
127f0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
12800 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
12810 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
12820 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
12830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
12840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12850 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
12860 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
12870 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
12880 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
12890 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
128a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
128b0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
128c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
128d0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
128e0 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
128f0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
12900 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
12910 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
12920 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
12930 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
12940 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
12950 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
12960 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
12970 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66  EAD_ONLY;.#ifdef
12980 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
12990 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62  ELETE.    pBt->b
129a0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
129b0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65  ECURE_DELETE;.#e
129c0 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
129d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
129e0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
129f0 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
12a00 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
12a10 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
12a20 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
12a30 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
12a40 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
12a50 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
12a60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12a70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12a80 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
12a90 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
12aa0 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
12ab0 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
12ac0 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
12ad0 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
12ae0 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
12af0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
12b00 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
12b10 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
12b20 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
12b30 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
12b40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
12b50 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
12b60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12b70 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
12b80 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
12b90 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
12ba0 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
12bb0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
12bc0 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
12bd0 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
12be0 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
12bf0 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
12c00 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
12c10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
12c20 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
12c30 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
12c40 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
12c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
12c60 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
12c70 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
12c80 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
12c90 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
12ca0 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
12cb0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
12cc0 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
12cd0 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
12ce0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12cf0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
12d00 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
12d10 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
12d20 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
12d30 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
12d40 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
12d50 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
12d60 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
12d70 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
12d80 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
12d90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12da0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
12db0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12dc0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
12dd0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
12de0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
12df0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
12e00 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
12e10 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
12e20 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
12e30 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
12e40 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
12e50 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
12e60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12e70 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
12e80 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
12e90 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
12ea0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
12eb0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
12ec0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
12ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12ee0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
12ef0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
12f00 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
12f10 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
12f20 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
12f30 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
12f40 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
12f50 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
12f60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
12f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12f80 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12f90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12fa0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
12fb0 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
12fc0 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
12fd0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
12fe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
12ff0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
13000 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
13010 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
13020 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13030 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
13040 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
13050 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
13060 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13070 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13080 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13090 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
130a0 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
130b0 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
130c0 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
130d0 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
130e0 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
130f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
13100 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
13110 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
13120 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
13130 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70  hared; ).      p
13140 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
13150 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13160 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
13170 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13180 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13190 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
131a0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
131b0 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
131c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
131d0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
131e0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
131f0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
13200 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13210 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
13220 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
13230 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
13240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
13250 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
13260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
13280 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13290 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
132a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
132b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
132c0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
132d0 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
132e0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
132f0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13300 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
13310 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
13320 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13330 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
13340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13350 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13360 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
13370 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
13380 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13390 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
133a0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
133b0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
133c0 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
133d0 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
133e0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
133f0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
13400 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
13410 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
13420 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
13430 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
13440 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
13450 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
13460 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
13470 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
13480 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
13490 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
134a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
134b0 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
134c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
134d0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
134e0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
134f0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
13500 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
13510 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
13520 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
13530 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
13540 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
13550 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
13560 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
13570 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
13580 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
13590 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
135a0 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
135b0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
135c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
135d0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
135e0 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
135f0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
13600 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
13610 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
13620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13630 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
13640 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
13650 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
13660 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
13670 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
13680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13690 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
136a0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
136b0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
136c0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
136d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
136e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
136f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
13700 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
13710 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
13720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13730 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
13740 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
13750 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13760 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
13770 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
13780 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13790 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
137a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
137b0 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
137c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
137d0 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
137e0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
137f0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
13800 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
13810 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
13820 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
13830 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
13840 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
13850 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
13860 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
13870 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
13880 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
13890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
138a0 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
138b0 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
138c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
138d0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
138e0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
138f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
13900 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
13910 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
13920 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
13930 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13940 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
13950 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
13960 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13970 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
13980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13990 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
139a0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
139b0 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
139c0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
139d0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
139e0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
139f0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
13a00 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
13a10 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
13a20 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
13a30 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
13a40 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
13a50 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
13a60 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
13a70 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
13a80 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
13a90 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
13aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ab0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13ac0 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
13ad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13ae0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
13af0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
13b00 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
13b10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
13b20 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
13b30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13b40 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
13b50 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
13b60 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13b70 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13b80 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
13b90 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13ba0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
13bb0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
13bc0 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
13bd0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
13be0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
13bf0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
13c00 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
13c10 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13c20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13c30 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
13c40 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
13c50 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
13c60 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13c70 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13c80 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
13c90 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
13ca0 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
13cb0 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
13cc0 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
13cd0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
13ce0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
13cf0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
13d00 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
13d10 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
13d20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13d30 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
13d40 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
13d50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
13d60 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
13d70 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
13d80 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
13d90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13da0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
13db0 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
13dc0 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
13dd0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
13de0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
13df0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
13e00 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
13e10 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
13e20 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
13e30 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
13e40 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
13e50 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
13e60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
13e70 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
13e80 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
13e90 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
13ea0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
13eb0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
13ec0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
13ed0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
13ee0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
13ef0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
13f00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
13f10 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
13f20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
13f30 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
13f40 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
13f50 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
13f60 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
13f70 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
13f80 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
13f90 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
13fa0 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
13fb0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
13fc0 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
13fd0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
13fe0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
13ff0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14000 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14010 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14020 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14030 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14040 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14050 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14060 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14070 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14080 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14090 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
140a0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
140b0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
140c0 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
140d0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
140e0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
140f0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14100 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14110 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14120 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14130 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14140 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14150 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14160 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14170 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14180 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14190 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
141a0 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
141b0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
141c0 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
141d0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
141e0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
141f0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14200 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14210 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14220 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14230 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14240 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
14250 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
14260 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
14270 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
14280 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
14290 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
142a0 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
142b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
142c0 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
142d0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
142e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
142f0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14300 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
14310 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14320 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14330 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
14340 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
14350 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
14360 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
14370 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
14380 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
14390 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
143a0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
143b0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
143c0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
143d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
143e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
143f0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
14400 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
14410 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
14420 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
14430 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
14440 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14450 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
14460 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
14470 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14480 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
14490 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
144a0 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
144b0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
144c0 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
144d0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
144e0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
144f0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
14500 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
14510 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
14520 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
14530 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
14550 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
14560 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
14570 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
14580 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
14590 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
145a0 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
145b0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
145c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
145d0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
145e0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
145f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14600 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
14610 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
14620 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
14630 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
14640 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
14650 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
14660 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
14670 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
14680 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
14690 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
146a0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
146b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
146c0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
146d0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
146e0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
146f0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
14700 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14710 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
14720 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
14730 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
14740 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
14750 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
14760 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
14770 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
14780 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
14790 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
147a0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
147b0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
147c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
147d0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
147e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
147f0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
14800 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
14810 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
14820 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
14830 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
14840 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
14850 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
14860 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14870 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
14880 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
14890 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
148a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
148b0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
148c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
148d0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
148e0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
148f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14900 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
14910 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
14920 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
14930 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
14940 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
14950 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14960 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
14970 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
14980 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
14990 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
149a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
149b0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
149c0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
149d0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
149e0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
149f0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
14a00 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
14a10 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
14a20 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
14a30 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
14a40 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
14a50 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
14a60 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
14a70 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
14a80 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
14a90 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
14aa0 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
14ab0 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
14ac0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
14ad0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
14ae0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
14af0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
14b00 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
14b10 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
14b20 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
14b30 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
14b40 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
14b50 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
14b60 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
14b70 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
14b80 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
14b90 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
14ba0 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
14bb0 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
14bc0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
14bd0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
14be0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
14bf0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
14c00 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
14c10 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
14c20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
14c30 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
14c40 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
14c50 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
14c60 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
14c70 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
14c80 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
14c90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
14ca0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
14cb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14cc0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
14cd0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14ce0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
14cf0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
14d00 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14d10 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
14d20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14d40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
14d50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
14d60 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
14d70 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
14d80 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
14d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14da0 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
14db0 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
14dc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14dd0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
14de0 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
14df0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
14e00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14e10 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
14e20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14e30 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
14e40 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
14e50 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14e60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
14e70 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
14e80 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
14e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14ea0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
14ec0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
14ed0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
14ee0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
14ef0 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
14f00 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
14f10 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
14f20 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
14f30 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
14f40 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
14f50 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
14f60 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
14f70 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
14f80 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
14f90 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
14fa0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
14fb0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
14fc0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
14fd0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
14fe0 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
14ff0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
15000 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
15010 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
15020 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
15030 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
15040 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
15050 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
15060 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
15070 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
15080 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
15090 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
150a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
150b0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
150c0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
150d0 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
150e0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
150f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15100 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
15110 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
15120 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
15130 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
15140 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
15150 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
15160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15170 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15190 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
151a0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
151b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
151c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
151d0 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
151e0 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
151f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15200 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15210 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
15220 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
15230 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
15240 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
15250 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
15260 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
15270 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
15280 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
15290 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
152a0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
152b0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
152c0 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
152d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
152e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
152f0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
15300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15310 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15320 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
15330 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15340 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
15350 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
15360 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15370 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
15380 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
15390 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
153a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
153b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
153c0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
153d0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
153e0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
153f0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
15400 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
15410 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
15420 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
15430 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
15440 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
15450 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
15460 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
15470 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
15480 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
15490 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
154a0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
154b0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
154c0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
154d0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
154e0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
154f0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
15500 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
15510 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
15520 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
15530 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
15540 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
15550 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15560 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
15570 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
15580 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
15590 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
155a0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
155b0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
155c0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
155d0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
155e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
155f0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
15600 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
15610 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
15620 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
15630 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15640 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
15650 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
15660 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
15670 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
15680 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
15690 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
156a0 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
156b0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
156c0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
156d0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
156e0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
156f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
15700 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
15710 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
15720 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
15730 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
15740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15750 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15760 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
15770 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
15780 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
15790 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
157a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
157b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
157c0 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  C.  if( nReserve
157d0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
157e0 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69  erve ) pBt->opti
157f0 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38  malReserve = (u8
15800 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  )nReserve;.#endi
15810 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  f.  if( pBt->bts
15820 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
15830 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
15840 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15850 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
15860 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
15870 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
15880 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
15890 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
158a0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
158b0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
158c0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
158d0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
158e0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
158f0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
15900 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
15910 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
15920 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
15930 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
15940 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
15950 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
15960 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
15970 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
15980 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
15990 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
159a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
159b0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
159c0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
159d0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
159e0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
159f0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
15a00 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
15a10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
15a20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
15a30 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
15a40 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
15a50 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15a60 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
15a70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15a80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15a90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15aa0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
15ab0 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
15ac0 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
15ad0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
15ae0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
15af0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
15b00 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
15b10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15b20 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
15b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15b40 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
15b50 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
15b60 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
15b70 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
15b80 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
15b90 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
15ba0 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
15bb0 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
15bc0 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
15bd0 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
15be0 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
15bf0 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
15c00 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
15c10 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
15c20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
15c30 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
15c40 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
15c50 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
15c60 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
15c70 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
15c80 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
15c90 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
15ca0 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
15cb0 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
15cc0 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
15cd0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
15ce0 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
15cf0 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
15d00 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
15d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15d20 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
15d30 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
15d40 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
15d50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15d60 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
15d70 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d  tex) );.  n = p-
15d80 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
15d90 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
15da0 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ize;.  return n;
15db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15dc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15dd0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
15de0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
15df0 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
15e00 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
15e10 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
15e20 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
15e30 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
15e40 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
15e50 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
15e60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
15e70 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20  TE_HAS_MUTEX is 
15e80 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65  defined then the
15e90 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
15ea0 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74   is the.** great
15eb0 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  er of the curren
15ec0 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  t reserved space
15ed0 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
15ee0 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65   requested.** re
15ef0 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  serve space..*/.
15f00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15f10 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76  GetOptimalReserv
15f20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
15f30 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
15f40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15f50 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
15f60 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
15f70 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  x(p);.#ifdef SQL
15f80 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
15f90 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70  if( n<p->pBt->op
15fa0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e  timalReserve ) n
15fb0 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   = p->pBt->optim
15fc0 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  alReserve;.#endi
15fd0 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
15fe0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15ff0 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
16000 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
16010 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
16020 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
16030 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
16040 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
16050 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
16060 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
16070 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
16080 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
16090 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
160a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
160b0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
160c0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
160d0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
160e0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
160f0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
16100 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16110 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
16120 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
16130 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
16140 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
16150 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16160 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16170 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
16180 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
16190 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
161a0 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
161b0 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
161c0 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
161d0 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
161e0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
161f0 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
16200 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
16210 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
16220 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
16230 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
16240 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
16250 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
16260 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
16270 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16280 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16290 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
162a0 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
162b0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
162c0 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
162d0 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
162e0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
162f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16300 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
16310 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
16320 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16330 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
16340 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
16350 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16360 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn b;.}../*.*
16370 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
16380 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
16390 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
163a0 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
163b0 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
163c0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
163d0 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
163e0 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
163f0 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
16400 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
16410 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
16420 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
16430 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
16440 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
16450 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
16460 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
16470 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
16480 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16490 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
164a0 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
164b0 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
164c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
164d0 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
164e0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
164f0 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
16500 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16510 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16520 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
16530 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
16540 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16550 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
16560 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16570 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
16580 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
16590 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
165a0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
165b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
165c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
165d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
165e0 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
165f0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
16600 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
16610 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16620 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16630 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
16640 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
16650 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
16660 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
16670 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
16680 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
16690 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
166a0 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
166b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
166c0 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
166d0 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
166e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
166f0 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
16700 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
16710 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
16720 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
16730 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16740 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
16750 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
16760 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
16770 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
16780 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
16790 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
167a0 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
167b0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
167c0 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
167d0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
167e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
167f0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
16800 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
16810 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
16820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
16830 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
16840 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
16850 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
16860 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
16870 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
16880 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
16890 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
168a0 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
168b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
168c0 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
168d0 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
168e0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
168f0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
16900 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
16910 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
16920 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
16930 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
16940 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
16950 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
16960 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
16970 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
16980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16990 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
169a0 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
169b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
169c0 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
169d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
169e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
169f0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
16a00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16a10 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
16a20 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
16a30 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
16a40 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
16a50 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16a60 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
16a70 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
16a80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
16a90 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
16aa0 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
16ab0 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
16ac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16ad0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
16af0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
16b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16b10 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
16b20 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
16b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
16b50 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
16b60 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
16b70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
16b80 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16b90 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
16ba0 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
16bb0 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
16bc0 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
16bd0 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
16be0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
16bf0 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
16c00 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
16c10 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
16c20 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
16c30 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
16c40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
16c50 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
16c60 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
16c70 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
16c80 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
16c90 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
16ca0 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
16cb0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
16cc0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
16cd0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
16ce0 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
16cf0 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
16d00 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
16d10 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
16d20 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
16d30 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
16d40 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
16d50 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20  : R-43737-39999 
16d60 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69  Every valid SQLi
16d70 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
16d80 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77   begins.    ** w
16d90 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
16da0 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68  g 16 bytes (in h
16db0 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39  ex): 53 51 4c 69
16dc0 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20   74 65 20 66 6f 
16dd0 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20  72 6d.    ** 61 
16de0 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a  74 20 33 00. */.
16df0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
16e00 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
16e10 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
16e20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
16e30 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
16e40 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
16e50 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
16e60 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
16e70 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
16e80 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
16e90 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
16ea0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
16eb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
16ec0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
16ed0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
16ee0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
16ef0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
16f00 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16f10 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
16f20 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
16f30 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
16f40 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
16f50 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
16f60 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
16f70 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
16f80 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
16f90 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
16fa0 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
16fb0 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
16fc0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
16fd0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
16fe0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
16ff0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
17000 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
17010 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
17020 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
17030 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
17040 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
17050 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
17060 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
17070 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
17080 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
17090 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
170a0 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
170b0 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
170c0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
170d0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
170e0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
170f0 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
17100 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
17110 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
17120 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17130 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
17140 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
17150 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
17160 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
17170 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
17180 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
17190 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
171a0 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
171b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
171d0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
171e0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
171f0 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
17200 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
17210 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
17220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17230 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
17240 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17250 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
17260 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
17270 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
17280 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
17290 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
172a0 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
172b0 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
172c0 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
172d0 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
172e0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
172f0 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
17300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
17310 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
17320 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
17330 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
17340 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
17350 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
17360 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
17370 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
17380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
17390 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
173a0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
173b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
173c0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
173d0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
173e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
173f0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
17400 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
17410 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
17420 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
17430 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
17440 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
17450 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
17460 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
17470 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
17480 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
17490 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
174a0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
174b0 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
174c0 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
174d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
174e0 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
174f0 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
17500 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
17510 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
17520 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
17530 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
17540 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
17550 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
17560 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
17570 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
17580 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
17590 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
175a0 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
175b0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
175c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
175d0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
175e0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
175f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17600 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
17610 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
17620 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
17630 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
17640 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
17650 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
17660 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
17670 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
17680 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
17690 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
176a0 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
176b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
176c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
176d0 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
176e0 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
176f0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
17700 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17710 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
17720 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
17730 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
17740 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
17750 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17760 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
17770 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
17780 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
17790 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
177a0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
177b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
177c0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
177d0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
177e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
177f0 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
17800 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
17810 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
17820 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
17830 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
17840 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
17850 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
17860 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
17870 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
17880 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
17890 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
178a0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
178b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
178c0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
178d0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
178e0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
178f0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
17900 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
17910 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
17920 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
17930 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
17940 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
17950 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
17960 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
17970 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
17980 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
17990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
179a0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
179b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
179c0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
17a00 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
17a10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17a20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
17a30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
17a40 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
17a50 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
17a60 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
17a70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
17a80 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
17a90 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17aa0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
17ab0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
17ac0 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
17ad0 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
17ae0 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
17af0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
17b00 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
17b10 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
17b20 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
17b30 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
17b40 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
17b50 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
17b60 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
17b70 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
17b80 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
17b90 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17ba0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
17bb0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17bc0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
17bd0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17be0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
17bf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17c00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17c10 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
17c20 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
17c30 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
17c40 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
17c50 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
17c60 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
17c70 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
17c80 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
17c90 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
17ca0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
17cb0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
17cc0 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
17cd0 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
17ce0 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
17cf0 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
17d00 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
17d10 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
17d20 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
17d30 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
17d40 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
17d50 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
17d60 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
17d70 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
17d80 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
17d90 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
17da0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
17db0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
17dc0 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
17dd0 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
17de0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
17df0 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
17e00 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
17e10 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
17e20 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
17e30 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
17e40 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
17e50 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
17e60 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
17e70 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
17e80 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
17e90 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
17ea0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
17eb0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
17ec0 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
17ed0 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
17ee0 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
17ef0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
17f00 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
17f10 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
17f20 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
17f30 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
17f40 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
17f50 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
17f60 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
17f70 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
17f80 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
17f90 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
17fa0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
17fb0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
17fc0 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
17fd0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
17fe0 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
17ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
18000 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
18010 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
18020 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
18030 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
18040 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
18050 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
18060 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
18070 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
18080 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
18090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
180a0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
180b0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
180c0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
180d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
180e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
180f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
18100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18110 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
18120 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
18130 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
18140 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
18150 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
18160 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
18170 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
18180 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
18190 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
181a0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
181b0 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
181c0 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
181d0 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
181e0 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
181f0 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
18200 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
18210 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
18220 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
18230 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
18240 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
18250 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
18260 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18270 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
18280 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
18290 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
182a0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
182b0 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
182c0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
182d0 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
182e0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
182f0 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
18300 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18310 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
18320 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
18330 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
18340 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
18350 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
18360 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
18370 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
18380 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
18390 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
183a0 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
183b0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
183c0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
183d0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
183e0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
183f0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
18400 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
18410 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
18420 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
18430 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
18440 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
18450 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
18460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
18470 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
18480 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
18490 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
184a0 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
184b0 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
184c0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
184d0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
184e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
184f0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
18500 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
18510 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
18520 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
18530 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
18540 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
18550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18560 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
18570 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
18580 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
18590 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
185a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
185b0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
185c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
185d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
185e0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
185f0 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
18600 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
18610 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
18620 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
18630 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
18640 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
18650 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
18660 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
18670 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
18680 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18690 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
186a0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
186b0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
186c0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
186d0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
186e0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
186f0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
18700 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
18710 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
18720 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
18730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
18740 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
18750 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
18760 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
18770 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
18780 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
18790 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
187a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
187b0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
187c0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
187d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
187e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
187f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
18800 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
18810 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
18820 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
18830 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18840 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
18850 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
18860 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
18870 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
18880 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
18890 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
188a0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
188b0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
188c0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
188d0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
188e0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
188f0 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
18900 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
18910 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
18920 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
18930 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
18940 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
18950 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
18960 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
18970 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
18980 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
18990 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
189a0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
189b0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
189c0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
189d0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
189e0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
189f0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
18a00 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
18a10 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
18a20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
18a30 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
18a40 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
18a50 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
18a60 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
18a70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18a80 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
18a90 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
18aa0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
18ab0 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
18ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18ad0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
18ae0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
18af0 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
18b00 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
18b10 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
18b20 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
18b30 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
18b40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
18b50 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
18b60 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
18b70 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
18b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18b90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
18ba0 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
18bb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18bc0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
18bd0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
18be0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
18bf0 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
18c00 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
18c10 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
18c20 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
18c30 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
18c40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
18c50 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
18c60 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
18c70 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
18c80 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
18c90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18ca0 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
18cb0 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
18cc0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
18cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18ce0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18cf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
18d00 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
18d10 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
18d20 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
18d30 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
18d40 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
18d50 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
18d60 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
18d70 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
18d80 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
18d90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
18da0 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
18db0 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
18dc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
18dd0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
18de0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
18df0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
18e00 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
18e10 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
18e20 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
18e30 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
18e40 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
18e50 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
18e60 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
18e70 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
18e80 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
18e90 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
18ea0 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
18eb0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
18ec0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
18ed0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
18ee0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
18ef0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
18f00 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
18f10 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
18f20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
18f30 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
18f40 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
18f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
18f60 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
18f70 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
18f80 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
18f90 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
18fa0 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
18fb0 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
18fc0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
18fd0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
18fe0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
18ff0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19000 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
19010 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19020 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
19030 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19040 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
19050 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
19060 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
19070 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
19080 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
19090 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
190a0 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
190b0 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
190c0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
190d0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
190e0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
190f0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
19100 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
19110 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
19120 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
19130 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
19140 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
19150 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
19160 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
19170 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
19180 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
19190 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
191a0 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
191b0 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
191c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
191d0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
191e0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
191f0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
19200 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
19210 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
19220 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
19230 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
19240 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
19250 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
19260 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
19270 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
19280 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
19290 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
192a0 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
192b0 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
192c0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
192d0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
192e0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
192f0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
19300 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
19310 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
19320 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
19330 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
19340 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
19350 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
19360 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
19370 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
19380 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
19390 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
193a0 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
193b0 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
193c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
193d0 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
193e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
193f0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
19400 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
19410 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19420 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
19430 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
19440 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
19450 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
19460 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
19470 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
19480 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
19490 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
194a0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
194b0 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
194c0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
194d0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
194e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
194f0 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
19500 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
19510 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
19520 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
19530 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
19540 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
19550 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
19560 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
19570 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
19580 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
19590 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
195a0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
195b0 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
195c0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
195d0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
195e0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
195f0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
19600 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
19610 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19620 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
19630 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
19640 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19650 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
19660 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
19670 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
19680 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
19690 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
196a0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
196b0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
196c0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
196d0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
196e0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
196f0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
19700 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
19710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
19720 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
19730 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19740 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
19750 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
19760 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
19770 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
19780 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
19790 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
197a0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
197b0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
197c0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
197d0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
197e0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
197f0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
19800 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
19810 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
19820 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
19830 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
19840 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19850 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
19860 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
19870 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
19880 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
19890 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
198a0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
198b0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
198c0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
198d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
198e0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
198f0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
19900 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
19910 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
19920 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
19930 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
19940 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
19950 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
19960 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
19970 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
19980 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
19990 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
199a0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
199b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
199c0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
199d0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
199e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
199f0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
19a00 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
19a10 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
19a20 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
19a30 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
19a40 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
19a50 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
19a60 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
19a70 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
19a80 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
19a90 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
19aa0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
19ab0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
19ac0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
19ad0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
19ae0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
19af0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
19b00 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
19b10 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
19b20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
19b30 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
19b40 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
19b50 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
19b60 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
19b70 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
19b80 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
19b90 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
19ba0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
19bb0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
19bc0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
19bd0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
19be0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
19bf0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
19c00 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
19c10 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
19c20 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
19c30 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
19c40 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
19c50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19c60 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
19c70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
19c80 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
19c90 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
19ca0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19cb0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19ce0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
19cf0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
19d00 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
19d10 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
19d20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
19d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19d40 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
19d50 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
19d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19d70 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
19d80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d90 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
19da0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
19db0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
19dc0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
19dd0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
19de0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
19df0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
19e00 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
19e10 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
19e20 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
19e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19e40 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19e50 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
19e60 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
19e70 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
19e80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19e90 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
19ea0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
19eb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
19ec0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
19ed0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
19ee0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
19ef0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
19f00 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
19f10 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
19f20 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
19f30 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
19f40 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
19f50 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
19f60 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
19f70 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
19f80 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
19f90 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
19fa0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
19fb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19fc0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
19fd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
19fe0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
19ff0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1a000 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1a010 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1a020 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1a030 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1a040 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1a050 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1a060 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1a070 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1a080 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1a090 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1a0a0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1a0b0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1a0c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a0d0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1a0e0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1a0f0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1a100 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1a110 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1a120 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1a130 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1a140 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1a150 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a160 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1a170 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1a180 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1a190 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1a1a0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1a1b0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1a1c0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1a1d0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1a1e0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1a1f0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1a200 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1a210 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1a220 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1a230 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a240 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a250 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1a260 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1a270 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1a280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a2a0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1a2b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1a2c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a2d0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1a2e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1a2f0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1a300 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1a320 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1a330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a340 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1a350 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1a360 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1a370 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1a380 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1a390 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1a3a0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1a3b0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1a3c0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1a3d0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1a3e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1a3f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1a400 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1a410 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1a420 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
1a430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1a440 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1a450 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1a460 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1a470 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1a480 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1a490 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a4a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a4b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a4c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1a4d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1a4e0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1a4f0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1a500 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1a510 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1a520 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1a530 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1a540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1a550 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1a560 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1a570 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1a580 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1a590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1a5a0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1a5b0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1a5c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1a5f0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1a600 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1a630 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1a640 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a670 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1a680 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1a690 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
1a6a0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1a6b0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
1a6c0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1a6d0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1a6e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a6f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1a700 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1a710 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1a720 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1a730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a740 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
1a750 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
1a760 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1a770 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1a780 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1a790 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1a7a0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1a7b0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1a7c0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1a7d0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1a7e0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1a7f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1a800 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1a810 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1a820 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1a830 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1a840 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1a850 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1a860 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1a870 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1a880 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1a890 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1a8a0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a8b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a8c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1a8d0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1a8e0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1a8f0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
1a900 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1a910 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
1a920 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1a930 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a940 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1a950 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1a960 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1a970 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1a980 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1a990 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1a9a0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1a9b0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1a9c0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1a9d0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1a9e0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1a9f0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1aa00 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1aa10 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1aa20 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1aa30 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1aa40 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1aa50 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1aa60 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1aa70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1aa80 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1aa90 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1aaa0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1aab0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1aad0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1aae0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1aaf0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1ab00 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1ab10 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1ab20 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1ab30 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1ab40 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1ab50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ab60 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1ab70 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1ab80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1ab90 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1aba0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1abb0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1abc0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1abd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1abe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1abf0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1ac00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1ac10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1ac20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1ac30 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1ac40 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1ac50 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1ac60 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1ac70 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1ac80 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1ac90 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1aca0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1acb0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1acc0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1acd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ace0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1acf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1ad00 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1ad10 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1ad20 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
1ad30 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1ad40 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
1ad50 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1ad60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1ad70 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1ad80 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1ad90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ada0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1adb0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1adc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1add0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1ade0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1adf0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1ae00 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1ae10 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1ae20 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1ae30 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1ae40 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1ae50 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1ae60 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1ae70 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
1ae80 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
1ae90 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
1aea0 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
1aeb0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
1aec0 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
1aed0 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
1aee0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1aef0 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
1af00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1af10 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
1af20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
1af30 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1af40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1af50 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1af60 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
1af70 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
1af80 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
1af90 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
1afa0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1afb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1afc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1afd0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
1afe0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
1aff0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
1b000 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
1b010 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1b020 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1b030 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
1b040 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
1b050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1b060 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b070 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1b080 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b090 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b0a0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1b0b0 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
1b0c0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1b0d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b0e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1b0f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
1b100 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1b110 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
1b120 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
1b130 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1b140 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
1b150 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
1b160 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
1b170 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
1b180 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1b190 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1b1a0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1b1b0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1b1c0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
1b1d0 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
1b1e0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1b1f0 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
1b200 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
1b210 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1b220 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
1b230 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
1b240 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
1b250 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
1b260 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1b270 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1b280 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
1b290 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
1b2a0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
1b2b0 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
1b2c0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2e0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
1b2f0 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
1b300 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1b310 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
1b320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1b330 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
1b340 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1b350 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
1b360 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
1b370 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
1b380 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
1b390 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1b3a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1b3b0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1b3c0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1b3d0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1b3e0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1b3f0 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1b400 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1b410 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1b420 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1b430 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1b440 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1b450 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1b460 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1b470 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1b480 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1b490 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1b4a0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1b4b0 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1b4c0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1b4d0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1b4e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1b4f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b500 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1b510 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1b520 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1b530 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
1b540 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
1b550 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
1b560 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
1b570 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
1b580 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
1b590 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
1b5a0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
1b5b0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
1b5c0 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
1b5d0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
1b5e0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
1b5f0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
1b600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b610 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
1b620 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
1b630 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1b640 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
1b650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1b670 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
1b680 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
1b690 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
1b6a0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
1b6b0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
1b6c0 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
1b6d0 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
1b6e0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
1b6f0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1b700 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
1b710 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1b720 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
1b730 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
1b740 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
1b750 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
1b760 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1b770 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
1b780 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
1b790 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
1b7a0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
1b7b0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1b7c0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b7d0 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
1b7e0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1b7f0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1b800 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
1b810 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1b820 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1b830 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1b840 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1b850 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1b860 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
1b870 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
1b880 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1b890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b8a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b8b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b8c0 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
1b8d0 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
1b8e0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1b8f0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
1b900 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1b910 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
1b920 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1b930 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
1b940 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
1b950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b960 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b970 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b980 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
1b990 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
1b9a0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
1b9b0 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
1b9c0 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
1b9d0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
1b9e0 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
1b9f0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
1ba00 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
1ba10 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
1ba20 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1ba30 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
1ba40 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1ba50 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1ba60 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
1ba70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
1ba80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ba90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1baa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1bab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1bac0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
1bad0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1bae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1baf0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1bb00 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1bb10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1bb20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1bb30 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
1bb40 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
1bb50 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1bb60 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
1bb70 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1bb80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1bb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bba0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1bbb0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
1bbc0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
1bbd0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1bbe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1bbf0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1bc00 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
1bc10 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
1bc20 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
1bc30 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1bc40 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
1bc50 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
1bc60 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
1bc70 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
1bc80 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
1bc90 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1bca0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
1bcb0 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
1bcc0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
1bcd0 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
1bce0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
1bcf0 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
1bd00 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
1bd10 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
1bd20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1bd30 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
1bd40 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1bd50 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
1bd60 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
1bd70 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
1bd80 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
1bd90 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1bda0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
1bdb0 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
1bdc0 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
1bdd0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
1bde0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1bdf0 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
1be00 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
1be10 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
1be20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1be30 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
1be40 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
1be50 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
1be60 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1be70 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1be80 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
1be90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
1bea0 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
1beb0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
1bec0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1bed0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
1bee0 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
1bef0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
1bf00 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
1bf10 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1bf20 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
1bf30 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
1bf40 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
1bf50 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
1bf60 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
1bf70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
1bf80 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
1bf90 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
1bfa0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
1bfb0 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
1bfc0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
1bfd0 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
1bfe0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
1bff0 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
1c000 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1c010 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1c020 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
1c030 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
1c040 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1c050 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c060 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1c070 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
1c080 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
1c090 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
1c0a0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
1c0b0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
1c0c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1c0d0 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
1c0e0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
1c0f0 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
1c100 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1c110 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c120 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
1c130 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
1c140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c150 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1c160 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
1c170 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
1c180 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
1c190 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1c1a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c1c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
1c1d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1c1e0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
1c1f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1c200 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1c210 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
1c220 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1c230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
1c240 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1c250 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1c260 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1c270 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
1c280 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
1c290 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
1c2a0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
1c2b0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
1c2c0 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
1c2d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
1c2e0 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
1c2f0 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
1c300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1c310 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
1c320 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
1c330 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
1c340 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
1c350 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
1c360 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1c370 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1c380 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
1c390 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1c3a0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1c3b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1c3c0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1c3d0 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
1c3e0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
1c3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1c400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c410 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c430 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1c440 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
1c450 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1c460 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1c470 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
1c480 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
1c490 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
1c4a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
1c4b0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
1c4c0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
1c4d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
1c4e0 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
1c4f0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
1c500 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
1c510 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1c520 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1c530 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
1c540 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
1c550 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
1c560 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1c570 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1c580 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
1c590 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1c5a0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
1c5b0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
1c5c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c5d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1c5e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
1c5f0 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
1c600 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
1c610 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
1c620 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
1c630 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
1c640 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
1c650 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1c660 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
1c670 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
1c680 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1c690 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
1c6a0 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
1c6b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1c6c0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
1c6d0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
1c6e0 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
1c6f0 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
1c700 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
1c710 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
1c720 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
1c730 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
1c740 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1c750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
1c760 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
1c770 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
1c780 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
1c790 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
1c7a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1c7b0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1c7c0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1c7d0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1c7e0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
1c7f0 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
1c800 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c820 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c830 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
1c840 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c860 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1c870 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
1c880 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
1c890 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
1c8a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1c8b0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
1c8c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
1c8d0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
1c8e0 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
1c8f0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
1c900 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
1c910 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1c920 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1c930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c970 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1c980 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1c990 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
1c9a0 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
1c9b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1c9c0 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
1c9d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1c9e0 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
1c9f0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1ca00 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
1ca10 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
1ca20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ca30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1ca40 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1ca50 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
1ca60 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1ca70 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1ca80 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
1ca90 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
1caa0 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
1cab0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
1cac0 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
1cad0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1cae0 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
1caf0 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
1cb00 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1cb10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
1cb20 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
1cb30 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1cb40 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
1cb50 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
1cb60 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1cb70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cb80 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
1cb90 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
1cba0 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
1cbb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cbc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cbd0 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
1cbe0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
1cbf0 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc10 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1cc20 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
1cc30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
1cc40 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
1cc50 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
1cc60 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
1cc70 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
1cc80 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
1cc90 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
1cca0 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
1ccb0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
1ccc0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
1ccd0 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
1cce0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1ccf0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
1cd00 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1cd10 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
1cd20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
1cd30 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1cd40 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1cd50 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
1cd60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
1cd70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1cd80 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
1cd90 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1cda0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
1cdb0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
1cdc0 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
1cdd0 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
1cde0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
1cdf0 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
1ce00 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
1ce10 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
1ce20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
1ce30 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
1ce40 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
1ce50 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
1ce60 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
1ce70 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1ce80 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1ce90 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1cea0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
1ceb0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
1cec0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
1ced0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
1cee0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1cef0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1cf00 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
1cf10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1cf20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1cf30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1cf40 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
1cf50 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1cf60 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
1cf70 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
1cf80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1cf90 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
1cfa0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
1cfb0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1cfc0 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
1cfd0 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
1cfe0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1cff0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1d000 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
1d010 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1d020 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
1d030 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
1d040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d050 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d060 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
1d070 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
1d080 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1d090 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1d0a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1d0b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d0c0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
1d0d0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1d0e0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
1d0f0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1d100 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
1d110 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
1d120 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d150 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1d160 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1d170 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1d180 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d190 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1d1a0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1d1b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d1c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1d1d0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
1d1e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d1f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1d200 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d210 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d220 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
1d230 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
1d240 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
1d250 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
1d260 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
1d270 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
1d280 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1d290 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1d2a0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
1d2b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1d2c0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
1d2d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d2e0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
1d2f0 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
1d300 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
1d310 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
1d320 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1d330 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
1d340 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
1d350 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
1d360 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
1d370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d380 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1d390 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1d3a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d3b0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1d3c0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1d3d0 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
1d3e0 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
1d3f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1d400 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
1d410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d420 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1d430 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
1d440 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1d450 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
1d460 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
1d470 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
1d480 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
1d490 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
1d4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d4b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1d4c0 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
1d4d0 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
1d4e0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
1d4f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d500 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1d510 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
1d520 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
1d530 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1d540 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
1d550 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1d560 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1d570 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d580 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
1d590 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
1d5a0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1d5b0 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
1d5c0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1d5d0 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
1d5e0 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
1d5f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1d600 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
1d610 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
1d620 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
1d630 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
1d640 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
1d650 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
1d660 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1d670 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1d680 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1d690 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1d6a0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1d6b0 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1d6c0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1d6d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d6e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d6f0 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1d700 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1d710 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1d720 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1d730 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1d740 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1d750 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1d760 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1d770 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d780 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1d790 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1d7a0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1d7b0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1d7c0 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1d7d0 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1d7e0 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1d7f0 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1d800 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1d810 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1d820 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1d830 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1d840 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1d850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1d860 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1d870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d880 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1d890 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1d8a0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1d8b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1d8c0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1d8d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1d8e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d8f0 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1d900 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1d910 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1d920 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1d930 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1d940 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1d950 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1d960 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1d970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d980 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1d990 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1d9a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1d9b0 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1d9c0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1d9d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1d9e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1d9f0 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1da00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1da10 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1da20 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1da30 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1da40 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1da50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1da60 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1da70 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1da80 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1da90 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1daa0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1dab0 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1dac0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1dad0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1dae0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1daf0 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1db00 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1db10 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1db20 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1db30 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1db40 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1db50 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1db60 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1db70 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1db80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1db90 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1dba0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1dbb0 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1dbc0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1dbd0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1dbe0 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1dbf0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1dc00 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1dc10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1dc20 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1dc30 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1dc40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1dc50 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1dc60 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1dc70 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1dc80 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1dc90 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1dca0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1dcb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1dcc0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1dcd0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1dce0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1dcf0 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1dd00 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1dd10 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1dd20 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1dd30 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1dd40 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1dd50 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1dd60 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1dd70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1dd80 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1dd90 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1dda0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1ddb0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1ddc0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1ddd0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1dde0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1ddf0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1de00 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1de10 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1de20 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1de30 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1de40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1de50 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1de60 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1de70 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1de80 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1de90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1dea0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1deb0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1dec0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1ded0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1dee0 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1def0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1df00 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1df10 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1df20 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1df30 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1df40 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1df50 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1df60 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1df70 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1df80 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1df90 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1dfa0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1dfb0 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1dfc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1dfd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1dfe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1dff0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1e000 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1e010 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e020 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1e030 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1e040 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e050 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e060 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1e070 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1e080 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1e090 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1e0a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e0c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1e0d0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1e0e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e0f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1e100 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1e110 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e120 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1e130 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1e140 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1e150 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1e160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e170 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1e180 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1e190 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1e1a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e1b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e1c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e1d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e1e0 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1e1f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1e200 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1e210 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1e220 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1e230 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1e240 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1e250 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1e260 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1e270 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e280 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1e290 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1e2a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e2b0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1e2c0 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1e2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e2e0 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1e2f0 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1e300 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1e310 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1e320 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1e330 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1e340 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1e350 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1e360 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1e370 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1e380 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1e390 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1e3a0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1e3b0 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1e3c0 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1e3d0 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1e3e0 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1e3f0 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1e400 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1e410 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1e420 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1e430 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1e440 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1e450 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1e460 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1e470 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1e480 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1e490 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1e4a0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1e4b0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1e4c0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1e4d0 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1e4e0 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1e4f0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1e500 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1e510 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1e520 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1e530 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1e540 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1e550 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1e560 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1e570 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1e580 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1e590 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1e5a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1e5b0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1e5c0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1e5d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1e5e0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1e5f0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1e600 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1e610 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1e620 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1e630 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1e640 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1e650 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1e660 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1e670 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1e680 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1e690 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1e6a0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1e6b0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1e6c0 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1e6d0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1e6e0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1e6f0 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1e700 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1e710 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1e720 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1e730 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1e740 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1e750 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1e760 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1e770 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1e780 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1e790 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1e7a0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1e7b0 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1e7c0 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1e7d0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1e7e0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1e7f0 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1e800 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1e810 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1e820 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1e830 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1e840 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1e850 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1e860 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1e870 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1e880 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1e890 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1e8a0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1e8b0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1e8c0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1e8d0 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1e8e0 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1e8f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e900 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1e910 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1e920 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1e930 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1e940 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1e950 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1e960 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1e970 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1e980 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1e990 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1e9a0 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1e9b0 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1e9c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1e9d0 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1e9e0 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1e9f0 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1ea00 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1ea10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1ea20 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1ea30 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1ea40 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1ea50 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1ea60 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1ea70 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1ea80 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1ea90 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1eaa0 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1eab0 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1eac0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1ead0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1eae0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1eaf0 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1eb00 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1eb10 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1eb20 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1eb30 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1eb40 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1eb50 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1eb60 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1eb70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1eb80 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1eb90 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1eba0 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1ebb0 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1ebc0 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1ebd0 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1ebe0 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1ebf0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1ec00 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1ec10 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1ec20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ec30 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1ec40 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1ec50 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1ec60 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1ec70 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1ec80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1ec90 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1eca0 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1ecb0 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1ecc0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1ecd0 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1ece0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1ecf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1ed00 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1ed10 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1ed20 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1ed30 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1ed40 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1ed50 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1ed60 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1ed70 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1ed80 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1ed90 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1eda0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1edb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1edc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1edd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ede0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1edf0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1ee00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1ee10 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1ee20 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1ee30 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1ee40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ee50 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1ee60 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1ee70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ee80 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1ee90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1eea0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1eeb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1eec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
1eed0 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20  DataVersion--;  
1eee0 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f  /* Compensate fo
1eef0 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56  r pPager->iDataV
1ef00 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20  ersion++; */.   
1ef10 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ef20 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1ef30 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1ef40 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1ef50 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1ef60 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1ef70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ef80 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1ef90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1efa0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1efb0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1efc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1efd0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1efe0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1eff0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1f000 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1f010 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f020 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1f030 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1f050 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f060 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1f070 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1f080 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f0a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f0b0 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1f0c0 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1f0d0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1f0e0 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1f0f0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1f100 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72  or on any BtShar
1f110 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1f120 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f  * references.  O
1f130 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e  r if the writeOn
1f140 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ly flag is set t
1f150 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a  o 1, then only.*
1f160 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72  * trip write cur
1f170 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72  sors and leave r
1f180 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68  ead cursors unch
1f190 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  anged..**.** Eve
1f1a0 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63  ry cursor is a c
1f1b0 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
1f1c0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
1f1d0 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61  g cursors.** tha
1f1e0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65  t belong to othe
1f1f0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1f200 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
1f210 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72  en to be.** shar
1f220 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69  ing the cache wi
1f230 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
1f240 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1f250 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
1f260 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1f270 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  . If the writeOn
1f280 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  ly.** flag is tr
1f290 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ue, then only wr
1f2a0 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64  ite-cursors need
1f2b0 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65   be tripped - re
1f2c0 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f  ad-only.** curso
1f2d0 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75  rs save their cu
1f2e0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
1f2f0 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79  so that they may
1f300 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f   continue .** fo
1f310 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c  llowing the roll
1f320 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69  back. Or, if wri
1f330 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c  teOnly is false,
1f340 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1f350 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e   .** tripped. In
1f360 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f   general, writeO
1f370 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20  nly is false if 
1f380 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f390 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20  being.** rolled 
1f3a0 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68  back modified th
1f3b0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1f3c0 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
1f3d0 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70  b-tree root.** p
1f3e0 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65  ages may be move
1f3f0 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  d or deleted fro
1f400 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  m the database a
1f410 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e  ltogether, makin
1f420 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66  g.** it unsafe f
1f430 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
1f440 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
1f450 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  ** If the writeO
1f460 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  nly flag is true
1f470 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73   and an error is
1f480 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
1f490 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68  le .** saving th
1f4a0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
1f4b0 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c  on of a read-onl
1f4c0 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75  y cursor, all cu
1f4d0 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75  rsors, .** inclu
1f4e0 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75  ding all read-cu
1f4f0 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
1f500 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1f510 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1f520 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1f530 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1f540 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76  urs while.** sav
1f550 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73  ing a cursor pos
1f560 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65  ition, an SQLite
1f570 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1f580 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f590 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1f5a0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1f5b0 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77  t errCode, int w
1f5c0 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  riteOnly){.  BtC
1f5d0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20  ursor *p;.  int 
1f5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f5f0 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74  .  assert( (writ
1f600 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74  eOnly==0 || writ
1f610 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43  eOnly==1) && BTC
1f620 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29  F_WriteFlag==1 )
1f630 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1f640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1f650 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1f660 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65  .    for(p=pBtre
1f670 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1f680 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1f690 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1f6a0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
1f6b0 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
1f6c0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1f6d0 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
1f6e0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
1f6f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
1f700 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
1f710 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
1f720 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
1f730 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1f740 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
1f750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f770 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
1f780 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1f790 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
1f7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1f7b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1f7c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1f7e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1f7f0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
1f800 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1f810 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1f820 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
1f830 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1f840 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1f850 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1f860 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
1f870 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1f880 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
1f890 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1f8a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1f8b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f8c0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1f8d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1f8f0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1f900 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
1f910 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
1f920 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
1f930 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
1f940 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
1f950 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
1f960 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
1f970 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
1f980 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
1f990 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
1f9a0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
1f9b0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
1f9c0 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
1f9d0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
1f9e0 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
1f9f0 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
1fa00 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1fa10 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1fa20 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1fa30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1fa40 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1fa50 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1fa60 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1fa70 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1fa80 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1fa90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1faa0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1fab0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1fac0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
1fad0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1fae0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1faf0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1fb00 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
1fb10 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
1fb20 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
1fb30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
1fb40 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
1fb50 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
1fb60 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1fb70 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
1fb80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fb90 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1fba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fbb0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1fbc0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1fbd0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1fbe0 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
1fbf0 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
1fc00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1fc10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1fc20 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
1fc30 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1fc40 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1fc50 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
1fc60 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
1fc70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1fc80 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
1fc90 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
1fca0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
1fcb0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1fcc0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1fcd0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1fce0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1fcf0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1fd00 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1fd10 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1fd20 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1fd30 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1fd40 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1fd50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1fd60 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1fd70 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1fd80 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1fd90 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1fda0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1fdb0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1fdc0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1fdd0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1fde0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1fdf0 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1fe00 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1fe10 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1fe20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1fe30 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1fe40 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1fe50 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1fe60 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1fe70 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1fe80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1fe90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1fea0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1feb0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1fec0 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1fed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1fee0 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1fef0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1ff00 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1ff10 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ff20 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1ff30 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1ff40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1ff50 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1ff60 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1ff70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ff80 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1ff90 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1ffa0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ffb0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1ffc0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1ffd0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1ffe0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1fff0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
20000 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20010 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20030 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
20040 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20050 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
20060 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
20070 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
20080 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
20090 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
200a0 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
200b0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
200c0 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
200d0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
200e0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
200f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
20100 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
20110 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
20120 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
20130 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
20140 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
20150 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20160 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
20170 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
20180 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
20190 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
201a0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
201b0 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
201c0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
201d0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
201e0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
201f0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
20200 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
20210 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
20220 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
20230 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
20240 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
20250 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
20260 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
20270 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
20280 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
20290 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
202a0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
202b0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
202c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
202d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
202e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
202f0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
20300 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
20310 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
20320 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
20330 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
20340 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
20350 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
20360 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
20370 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
20380 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
20390 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
203a0 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
203b0 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
203c0 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
203d0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
203e0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
203f0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
20400 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
20410 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
20420 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
20430 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
20440 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
20450 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20460 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
20470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20480 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
20490 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
204a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
204b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
204c0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
204d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
204e0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
204f0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
20500 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
20510 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
20520 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
20530 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
20540 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
20550 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
20560 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
20570 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
20580 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
20590 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
205a0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
205b0 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
205c0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
205d0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
205e0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
205f0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
20600 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
20610 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
20620 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
20630 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
20640 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20650 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
20660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20670 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
20680 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
20690 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
206a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
206b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
206c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
206d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
206e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
206f0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
20700 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
20710 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
20720 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
20730 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
20740 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
20750 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
20760 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
20770 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
20780 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
20790 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
207a0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
207b0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
207c0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
207d0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
207e0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
207f0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
20800 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
20810 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
20820 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
20830 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
20840 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
20850 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
20860 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
20870 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
20880 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
20890 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
208a0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
208b0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
208c0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
208d0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
208e0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
208f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20900 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
20910 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
20920 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
20930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20940 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
20950 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
20960 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
20970 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20980 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
20990 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
209a0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
209b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
209c0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
209d0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
209e0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
209f0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
20a00 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
20a10 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
20a20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20a40 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
20a50 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
20a60 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
20a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20a80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
20a90 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
20aa0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
20ab0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
20ac0 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
20ad0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
20ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20af0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
20b00 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
20b10 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
20b20 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
20b30 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
20b40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
20b50 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
20b60 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
20b70 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
20b80 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
20b90 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
20ba0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
20bb0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
20bc0 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
20bd0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
20be0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
20bf0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
20c00 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
20c10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20c20 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
20c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c40 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
20c50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
20c60 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
20c70 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
20c80 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
20c90 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
20ca0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
20cb0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
20cc0 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
20cd0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
20ce0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
20cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
20d00 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
20d10 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
20d20 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
20d30 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
20d40 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
20d50 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
20d60 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
20d70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
20d80 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
20d90 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
20da0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
20db0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
20dc0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
20dd0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
20de0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
20df0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
20e00 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
20e10 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
20e20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
20e30 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
20e40 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
20e50 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
20e60 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
20e70 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
20e80 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
20e90 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
20ea0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
20eb0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
20ec0 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
20ed0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
20ee0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
20ef0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
20f00 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
20f10 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
20f20 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
20f30 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
20f40 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
20f50 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
20f60 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
20f70 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
20f80 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
20f90 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
20fa0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
20fb0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
20fc0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
20fd0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
20fe0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
20ff0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
21000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
21010 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
21020 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
21030 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
21040 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
21050 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
21060 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
21070 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21080 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
21090 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
210a0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
210b0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
210c0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
210d0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
210e0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
210f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
21100 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
21110 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
21120 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
21130 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
21140 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
21150 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
21160 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
21170 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
21180 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
21190 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
211a0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
211b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
211c0 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
211d0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
21200 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
21210 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21230 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
21240 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
21250 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
21280 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
21290 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
212a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
212b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
212c0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
212d0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
212e0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
212f0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21310 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
21320 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
21330 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21340 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
21350 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
21360 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
21370 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
21380 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
21390 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
213a0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
213b0 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
213c0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
213d0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
213e0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
213f0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
21400 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
21410 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
21420 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
21430 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
21440 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
21450 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
21460 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
21470 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
21480 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
21490 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
214a0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
214b0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
214c0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
214d0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
214e0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
214f0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
21500 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
21510 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
21520 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
21530 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
21540 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
21550 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
21560 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
21570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
21580 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
21590 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
215a0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
215b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
215c0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
215d0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
215e0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
215f0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
21600 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
21610 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
21620 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
21630 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
21640 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
21650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
21660 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
21670 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
21680 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
21690 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
216a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
216b0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
216c0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
216d0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
216e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
216f0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
21700 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
21710 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
21720 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
21730 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
21740 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
21750 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
21760 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
21770 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
21780 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
21790 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
217a0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
217b0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
217c0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
217d0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
217e0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
217f0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
21800 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
21810 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
21820 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
21830 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
21840 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
21850 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
21860 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
21870 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
21880 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
21890 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
218a0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
218b0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
218c0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
218d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
218e0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
218f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21900 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
21910 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
21920 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
21950 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
21960 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
21990 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
219a0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
219b0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
219e0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
219f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
21a00 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
21a30 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
21a40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a70 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
21a80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
21a90 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
21aa0 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
21ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21ac0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
21ad0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
21ae0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
21af0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
21b00 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
21b10 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
21b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21b30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
21b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21b50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21b60 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
21b70 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
21b80 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
21b90 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
21ba0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
21bb0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
21bc0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
21bd0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
21be0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
21bf0 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
21c00 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
21c10 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
21c20 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
21c30 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
21c40 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
21c50 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
21c60 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
21c70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21c80 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
21c90 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
21ca0 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
21cb0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
21cc0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
21cd0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
21ce0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
21cf0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
21d00 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
21d10 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
21d20 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
21d30 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
21d40 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
21d50 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
21d60 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
21d70 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
21d80 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
21d90 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
21da0 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
21db0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
21dc0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
21dd0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
21de0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
21df0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
21e00 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
21e10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
21e20 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
21e30 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
21e40 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
21e50 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
21e60 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
21e70 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
21e80 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
21e90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21ea0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
21eb0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
21ec0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
21ed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21ee0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
21ef0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
21f00 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
21f10 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
21f20 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
21f30 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
21f40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21f50 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
21f60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21f70 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
21f80 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
21f90 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
21fa0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
21fb0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
21fc0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
21fd0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
21fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
21ff0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22000 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
22010 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
22020 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
22030 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
22040 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
22050 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
22060 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
22070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
22080 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22090 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
220a0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
220b0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
220c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
220d0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
220e0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
220f0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
22100 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22110 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
22120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22130 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22140 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
22150 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
22160 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
22170 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
22180 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
22190 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
221a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
221b0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
221c0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
221d0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
221e0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
221f0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
22200 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
22210 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
22220 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
22230 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
22240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
22250 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
22260 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64  Cell()..*/.#ifnd
22270 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
22280 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
22290 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
222a0 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
222b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
222c0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
222d0 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
222e0 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
222f0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
22300 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
22310 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
22320 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
22330 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
22340 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
22350 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
22360 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
22370 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
22380 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
22390 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
223a0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
223b0 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
223c0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
223d0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
223e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
223f0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
22400 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
22410 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
22420 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
22430 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
22440 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
22450 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
22460 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
22470 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
22480 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
22490 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
224a0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
224b0 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
224c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
224d0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
224e0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
224f0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
22500 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
22510 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
22520 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
22530 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
22540 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
22550 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
22560 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
22570 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
22580 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
22590 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
225a0 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
225b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
225c0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
225d0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
225e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
225f0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
22600 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
22610 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
22620 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
22630 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
22640 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
22650 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
22660 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
22670 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
22680 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
22690 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
226a0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
226b0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
226c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
226d0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
226e0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
226f0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
22700 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
22710 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
22720 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
22730 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
22740 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
22750 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
22760 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
22770 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
22780 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
22790 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
227a0 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
227b0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
227c0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
227d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
227e0 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
227f0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
22800 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
22810 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
22820 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
22830 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
22840 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
22850 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22860 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22870 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22880 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22890 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
228a0 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70  r);.  *pSize = p
228b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
228c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
228d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
228e0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
228f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
22900 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
22910 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
22920 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
22930 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
22940 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
22950 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
22960 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
22970 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
22980 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
22990 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
229a0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
229b0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
229c0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
229d0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
229e0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
229f0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
22a00 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
22a10 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
22a20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
22a30 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
22a40 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
22a50 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
22a60 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
22a70 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
22a80 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
22a90 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
22aa0 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
22ab0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
22ac0 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
22ad0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
22ae0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
22af0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
22b00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22b10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22b20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22b30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22b40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
22b50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22b60 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge>=0 );.  asser
22b70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
22b80 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
22b90 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
22ba0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22bb0 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79  ->iPage]->intKey
22bc0 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74  Leaf==1 );.  get
22bd0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
22be0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
22bf0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
22c00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22c10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
22c20 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
22c30 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
22c40 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
22c50 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
22c60 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
22c70 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
22c80 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
22c90 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
22ca0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
22cb0 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
22cc0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
22cd0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
22ce0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
22cf0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
22d00 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
22d10 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
22d20 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
22d30 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
22d40 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
22d50 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
22d60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
22d70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
22d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
22d90 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22da0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
22db0 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
22dc0 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
22dd0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
22de0 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
22df0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
22e00 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
22e10 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
22e20 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
22e30 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
22e40 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
22e50 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
22e60 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
22e70 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
22e80 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
22e90 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
22ea0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
22eb0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
22ec0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
22ed0 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
22ee0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
22ef0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
22f00 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
22f10 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
22f20 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
22f30 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
22f40 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
22f50 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
22f60 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
22f70 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
22f80 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
22f90 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
22fa0 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
22fb0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
22fc0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
22fd0 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
22fe0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
22ff0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
23000 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23010 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
23020 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
23030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23040 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
23050 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
23060 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
23070 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
23080 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
23090 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
230a0 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
230b0 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
230c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
230d0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
230e0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
230f0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
23100 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
23110 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
23120 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
23130 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23140 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
23150 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
23160 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
23170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23180 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
23190 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
231a0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
231b0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
231c0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
231d0 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
231e0 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
231f0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
23200 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
23210 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
23220 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
23230 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
23240 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
23250 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
23260 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
23270 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
23280 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
23290 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
232a0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
232b0 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
232c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
232d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
232e0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
232f0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
23300 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
23310 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
23320 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
23330 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
23340 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
23350 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
23360 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
23370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23380 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
23390 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
233a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
233b0 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
233c0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
233d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
233e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
233f0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
23400 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
23410 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
23420 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
23430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23440 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
23450 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
23460 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
23470 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
23480 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
23490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
234a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
234b0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
234c0 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
234d0 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
234e0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
234f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
23500 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
23510 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
23520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23530 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
23540 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
23550 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
23560 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
23570 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
23580 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
23590 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
235a0 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
235b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
235c0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
235d0 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
235e0 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
235f0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
23600 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
23610 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
23620 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
23630 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
23640 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
23650 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
23660 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
23670 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
23680 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
23690 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
236a0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
236b0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
236c0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
236d0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
236e0 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
236f0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
23700 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
23710 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
23720 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
23730 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
23740 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
23750 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
23760 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
23770 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
23780 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23790 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
237a0 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
237b0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
237c0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
237d0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
237e0 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
237f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
23800 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
23810 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
23820 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23830 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
23840 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
23850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23860 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
23870 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
23880 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23890 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
238a0 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
238b0 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
238c0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
238d0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
238e0 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
238f0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
23900 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
23910 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
23920 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
23930 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
23940 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
23950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23960 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
23970 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23990 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
239a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
239b0 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
239c0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
239d0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
239e0 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
239f0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
23a00 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
23a10 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
23a20 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
23a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23a40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
23a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23a60 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
23a70 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
23a80 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
23a90 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
23aa0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
23ab0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
23ac0 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
23ad0 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
23ae0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
23af0 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
23b00 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
23b10 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
23b20 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
23b30 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
23b40 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
23b50 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
23b60 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
23b70 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
23b80 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
23b90 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
23ba0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
23bb0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
23bc0 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
23bd0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
23be0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
23bf0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
23c00 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
23c10 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
23c20 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
23c30 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
23c40 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
23c50 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
23c60 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
23c70 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
23c80 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
23c90 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
23ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
23cb0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
23cc0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
23cd0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
23ce0 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
23cf0 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
23d00 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
23d10 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
23d20 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
23d30 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61  azily .** popula
23d40 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
23d50 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
23d60 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
23d70 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
23d80 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
23d90 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
23da0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
23db0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
23dc0 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
23dd0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
23de0 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
23df0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
23e00 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
23e10 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
23e20 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
23e30 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
23e40 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
23e50 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
23e60 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
23e70 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
23e80 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
23e90 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
23ea0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
23eb0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
23ec0 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
23ed0 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
23ee0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
23ef0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
23f00 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
23f10 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
23f20 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
23f30 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
23f40 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
23f50 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
23f60 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
23f70 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23f80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23f90 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
23fa0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
23fb0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
23fc0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
23fd0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
23fe0 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
23ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
24000 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
24010 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
24020 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
24030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24040 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
24050 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
24060 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
24070 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
24080 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
24090 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
240a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
240b0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
240c0 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
240d0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
240e0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
240f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24100 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
24110 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
24120 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
24130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24140 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
24150 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
24160 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
24170 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
24180 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24190 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
241a0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
241b0 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
241c0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
241d0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
241e0 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
241f0 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
24200 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b  Buf;.  int bEnd;
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
24240 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
24250 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
24260 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
24270 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24280 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24290 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
242a0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
242b0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
242c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
242d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
242e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
242f0 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
24300 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
24310 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74      /* Always st
24320 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  art from beginni
24330 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f  ng for eOp==2 */
24340 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
24350 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
24360 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
24370 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20  Payload;.#ifdef 
24380 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
24390 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45  ERFLOW_READ.  bE
243a0 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d  nd = offset+amt=
243b0 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  =pCur->info.nPay
243c0 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61  load;.#endif.  a
243d0 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
243e0 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
243f0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69  nPayload );..  i
24400 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  f( &aPayload[pCu
24410 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
24420 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
24430 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
24440 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
24450 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
24460 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
24470 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
24480 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
24490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
244a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
244b0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
244c0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
244d0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
244e0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
244f0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
24500 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
24510 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
24520 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
24530 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
24540 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
24550 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
24560 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
24570 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
24580 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
24590 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
245a0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
245b0 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50  (eOp & 0x01), pP
245c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
245d0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
245e0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
245f0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
24600 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
24610 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
24620 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
24630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24640 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
24650 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
24660 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
24670 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
24680 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
24690 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
246a0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
246b0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
246c0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
246d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
246e0 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
246f0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
24700 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
24710 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
24720 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
24730 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
24740 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
24750 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
24760 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
24770 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
24780 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
24790 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
247a0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
247b0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
247c0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
247d0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
247e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
247f0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
24800 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
24810 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
24820 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
24830 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
24840 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
24850 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
24860 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
24870 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
24880 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
24890 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
248a0 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
248b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
248c0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
248d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
248e0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
248f0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
24900 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
24910 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
24920 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
24930 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
24940 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
24950 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
24960 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
24980 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
24990 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
249a0 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
249b0 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
249c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
249d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
249e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
249f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
24a00 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
24a10 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
24a20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
24a30 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
24a40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
24a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
24a70 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
24a80 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
24a90 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
24aa0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
24ab0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
24ac0 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
24ad0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
24ae0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
24af0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
24b00 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
24b10 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
24b20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
24b30 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
24b40 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
24b50 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
24b60 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
24b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
24b80 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
24b90 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24ba0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
24bb0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
24bc0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
24bd0 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
24be0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
24bf0 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
24c00 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
24c10 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
24c20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
24c30 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
24c40 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
24c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24c60 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
24c70 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
24c80 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
24c90 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
24ca0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
24cb0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
24cc0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
24cd0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
24ce0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
24cf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24d00 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
24d10 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
24d20 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
24d30 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
24d40 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
24d50 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
24d60 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
24d70 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
24d80 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
24d90 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
24da0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
24db0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
24dc0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
24dd0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
24de0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
24df0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
24e00 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
24e10 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
24e20 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
24e30 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
24e40 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
24e50 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
24e60 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
24e70 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
24e80 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
24e90 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
24ea0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
24eb0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
24ec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24ed0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
24ee0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
24ef0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
24f00 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
24f10 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
24f20 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
24f30 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
24f40 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
24f50 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
24f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24f70 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
24f80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24f90 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
24fa0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
24fb0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
24fc0 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
24fd0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
24fe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
24ff0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25000 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
25010 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
25020 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25030 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
25040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25050 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
25060 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
25070 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
25080 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25090 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
250a0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
250b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
250c0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
250d0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
250e0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
250f0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
25100 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
25110 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
25120 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
25130 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
25140 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
25150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25160 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25170 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
25180 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
25190 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
251a0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
251b0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
251c0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
251d0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
251e0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
251f0 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
25200 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
25210 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
25220 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
25230 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
25240 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
25250 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
25260 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
25270 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
25280 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
25290 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
252a0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
252b0 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
252c0 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
252d0 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
252e0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
252f0 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
25300 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
25310 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
25320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
25330 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
25340 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
25350 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
25360 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
25370 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
25380 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
25390 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
253a0 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
253b0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
253c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
253d0 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
253e0 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
253f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25400 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
25410 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
25420 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
25430 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
25440 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
25450 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
25460 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
25470 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
25480 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
25490 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
254a0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
254b0 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
254c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
254d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
254e0 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
254f0 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
25520 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
25530 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
25570 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
25580 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
255b0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
255c0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
255d0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
255e0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
255f0 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
25600 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
25610 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
25620 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
25630 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
25640 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
25650 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
25660 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
25670 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
25680 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
25690 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
256a0 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
256b0 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
256e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
256f0 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
25700 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
25710 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
25720 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25730 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
25740 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25760 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
25770 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
25780 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
25790 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
257a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
257b0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
257c0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
257d0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
257e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
257f0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
25800 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
25810 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
25820 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
25830 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
25840 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
25850 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
25860 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
25870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25880 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
25890 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
258a0 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
258b0 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
258c0 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
258d0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
258e0 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
258f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25910 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
25920 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
25930 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
25940 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
25950 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
25960 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
25970 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25980 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
25990 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
259a0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
259b0 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
259c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
259d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
259e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
259f0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
25a00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
25a20 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
25a30 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
25a40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
25a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25a60 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
25a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25a80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25aa0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
25ab0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
25ac0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
25ad0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
25ae0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
25af0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
25b00 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
25b10 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
25b20 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
25b30 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
25b40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
25b50 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
25b60 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
25b70 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
25b80 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
25b90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25ba0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
25bb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
25bc0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
25bd0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
25be0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
25bf0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
25c00 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
25c10 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
25c20 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
25c30 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
25c40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25c50 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
25c60 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
25c70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25c80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25c90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25ca0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25cb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
25cc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
25cd0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
25ce0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25cf0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
25d00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25d10 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
25d20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25d30 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
25d40 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
25d50 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
25d60 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
25d70 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
25d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
25d90 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
25da0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25db0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
25dc0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
25dd0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
25de0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
25df0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
25e00 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
25e10 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
25e20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25e30 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
25e40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
25e50 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
25e60 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
25e70 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
25e80 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
25e90 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
25ea0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
25eb0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
25ec0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
25ed0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25ee0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
25ef0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
25f00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
25f10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25f20 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
25f30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25f40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
25f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25f60 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
25f70 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
25f80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25f90 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
25fa0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
25fb0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
25fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25fd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25fe0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25ff0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26000 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26010 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26020 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26030 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
26040 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26060 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26070 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26080 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
26090 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
260a0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
260b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
260c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
260d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
260e0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
260f0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
26100 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
26110 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
26120 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
26130 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
26140 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
26150 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
26160 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
26170 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
26180 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
26190 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
261a0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
261b0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
261c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
261d0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
261e0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
261f0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
26200 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
26210 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
26220 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
26230 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
26240 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
26250 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
26260 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
26270 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
26280 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
26290 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
262a0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
262b0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
262c0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
262d0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
262e0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
262f0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
26300 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
26310 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
26320 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
26330 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
26340 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
26350 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
26360 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
26370 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
26380 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
26390 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
263a0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
263b0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
263c0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
263d0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
263e0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
263f0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
26400 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
26410 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
26420 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
26430 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
26440 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
26450 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
26460 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
26470 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
26480 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
26490 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
264a0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
264b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
264c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
264d0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
264e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
264f0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
26500 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
26510 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
26520 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
26530 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
26540 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
26550 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
26560 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26570 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26580 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
26590 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
265a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
265b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
265c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
265d0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
265e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
265f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26600 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26610 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26620 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26630 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26640 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26660 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
26670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26680 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
26690 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
266a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
266b0 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
266c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
266d0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
266e0 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
266f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
26700 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
26710 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
26720 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
26730 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
26740 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
26750 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
26760 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
26770 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
26780 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
26790 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
267a0 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
267b0 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
267c0 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
267d0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
267e0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
267f0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
26800 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
26810 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
26820 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
26830 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
26840 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
26850 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
26860 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
26870 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
26880 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
26890 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
268a0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
268b0 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
268c0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
268d0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
268e0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
268f0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
26900 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
26910 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
26920 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
26930 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
26940 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
26950 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
26960 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
26970 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
26980 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
26990 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
269a0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
269b0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
269c0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
269d0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
269e0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
269f0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
26a00 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
26a10 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
26a20 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
26a30 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
26a40 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
26a50 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
26a60 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
26a70 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
26a80 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
26a90 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
26aa0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
26ab0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
26ac0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
26ad0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
26ae0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
26af0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
26b00 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
26b10 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
26b20 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
26b30 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
26b40 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
26b50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
26b60 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
26b70 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
26b80 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
26b90 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
26ba0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
26bb0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
26bc0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
26bd0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
26be0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
26bf0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
26c00 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
26c10 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
26c20 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
26c30 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
26c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
26c50 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
26c60 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
26c70 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
26c80 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
26c90 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
26ca0 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
26cb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
26cc0 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
26cd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26ce0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26d00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26d10 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
26d20 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
26d30 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
26d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26d50 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
26d60 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
26d70 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
26d80 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
26d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26da0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26db0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
26dc0 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
26dd0 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20  no, &pNewPage,. 
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
26df0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
26e00 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
26e10 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
26e20 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
26e30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26e40 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
26e50 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
26e60 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
26e70 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
26e80 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
26e90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26ea0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
26eb0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
26ec0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
26ed0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
26ee0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
26ef0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
26f00 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
26f10 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
26f20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26f30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26f40 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
26f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
26f60 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
26f70 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
26f80 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
26f90 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
26fa0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
26fb0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
26fc0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
26fd0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
26fe0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
26ff0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
27000 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
27010 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
27020 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
27030 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
27040 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
27050 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
27060 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
27070 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27080 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
27090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
270a0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
270b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
270c0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
270d0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
270e0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
270f0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
27100 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
27110 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
27120 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
27150 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
27160 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
27170 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
27180 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
27190 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
271a0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
271b0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
271c0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
271d0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
271e0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
271f0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
27200 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
27210 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
27220 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
27230 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
27240 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
27250 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
27260 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
27270 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
27280 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
27290 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
272a0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
272b0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
272c0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
272d0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
272e0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
272f0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
27300 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
27310 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
27320 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
27330 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
27340 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
27350 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
27360 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
27370 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
27380 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
27390 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
273a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
273b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
273c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
273d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
273e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
273f0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
27400 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27410 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27420 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
27430 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
27440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27450 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
27460 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27470 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
27480 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27490 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
274a0 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
274b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
274c0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
274d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274e0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
274f0 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  l );..  releaseP
27500 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
27510 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
27520 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
27530 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
27540 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
27550 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
27560 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
27570 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d  CF_ValidOvfl);.}
27580 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
27590 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
275a0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
275b0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
275c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
275d0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
275e0 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
275f0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
27600 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
27610 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
27620 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
27630 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
27640 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
27650 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
27660 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
27670 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
27680 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
27690 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
276a0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
276b0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
276c0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
276d0 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
276e0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
276f0 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
27700 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
27710 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
27720 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
27730 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
27740 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
27750 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
27760 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
27770 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
27780 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
27790 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
277a0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
277b0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
277c0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
277d0 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
277e0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
277f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
27800 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
27810 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
27820 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
27830 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
27840 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
27850 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
27860 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
27870 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
27880 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
27890 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
278a0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
278b0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
278c0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
278d0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
278e0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
278f0 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
27900 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
27910 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
27920 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
27930 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
27940 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
27950 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
27960 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
27970 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
27980 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
27990 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
279a0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
279b0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
279c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
279d0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
279e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
279f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
27a00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27a10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27a20 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
27a30 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
27a40 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
27a50 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
27a60 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
27a70 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
27a80 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
27a90 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
27aa0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
27ab0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
27ac0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
27ad0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
27ae0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27af0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
27b00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27b10 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
27b20 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
27b30 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
27b40 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
27b50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
27b60 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
27b70 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
27b80 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
27b90 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61  while( pCur->iPa
27ba0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
27bb0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
27bc0 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20  ur->iPage--]);. 
27bd0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
27be0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
27bf0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27c00 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
27c10 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
27c20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
27c30 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
27c40 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
27c50 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
27c60 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
27c70 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
27ca0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
27cb0 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
27cc0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
27cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
27cf0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27d00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
27d10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27d20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
27d30 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
27d40 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
27d50 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
27d60 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
27d70 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
27d80 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
27d90 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
27da0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
27db0 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
27dc0 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
27dd0 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
27de0 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
27df0 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
27e00 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
27e10 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
27e20 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
27e30 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
27e40 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
27e50 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
27e60 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
27e70 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
27e80 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
27e90 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
27ea0 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
27eb0 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
27ec0 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
27ed0 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
27ee0 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
27ef0 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
27f00 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
27f10 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
27f20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
27f30 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
27f40 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
27f50 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
27f60 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
27f70 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
27f80 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
27f90 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
27fa0 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
27fb0 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
27fc0 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
27fd0 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
27fe0 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
27ff0 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
28000 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
28010 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
28020 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
28030 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28050 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
28060 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
28070 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
28080 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
28090 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
280a0 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
280b0 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
280c0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
280d0 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
280e0 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43  Cell>0 ){.    pC
280f0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28100 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
28110 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c  se if( !pRoot->l
28120 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
28130 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
28140 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
28150 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28160 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28170 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
28180 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
28190 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
281a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
281b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
281c0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
281d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
281e0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
281f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
28200 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28210 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20  R_INVALID;.  }. 
28220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28230 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28240 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
28250 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
28260 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
28270 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
28280 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
28290 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
282a0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
282b0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
282c0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
282d0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
282e0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
282f0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
28300 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
28310 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
28320 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
28330 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
28340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
28350 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
28360 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28370 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28390 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
283a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
283b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
283c0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
283d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
283e0 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
283f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28400 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28410 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
28420 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
28430 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
28440 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
28450 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28460 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
28470 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28480 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
28490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
284a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
284b0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
284c0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
284d0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
284e0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
284f0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
28500 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
28510 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
28520 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
28530 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
28540 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
28550 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
28560 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
28570 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
28580 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
28590 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
285a0 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
285b0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
285c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
285d0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
285e0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
285f0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
28600 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
28610 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
28620 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
28630 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
28640 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
28650 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
28660 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
28670 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
28680 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
28690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
286a0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
286b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
286c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
286d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
286e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
286f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
28700 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70  ile( !(pPage = p
28710 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28720 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
28730 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
28740 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28750 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28760 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
28770 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28780 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
28790 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
287a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
287b0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
287c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
287d0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69  ;.  }.  pCur->ai
287e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
287f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
28800 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  1;.  assert( pCu
28810 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
28820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
28830 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
28840 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d  BTCF_ValidNKey)=
28850 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
28860 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
28870 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28880 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
28890 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
288a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
288b0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
288c0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
288d0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
288e0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
288f0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
28900 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
28910 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
28920 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
28930 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
28940 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28950 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
28960 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
28970 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28980 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28990 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
289a0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
289b0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
289c0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
289d0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
289e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
289f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
28a00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28a10 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
28a20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28a30 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
28a40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28a50 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
28a60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
28a70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
28a80 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
28a90 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
28aa0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28ab0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
28ac0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
28ad0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
28ae0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
28af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28b00 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
28b10 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
28b20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
28b30 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
28b40 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
28b50 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
28b60 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
28b70 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
28b80 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
28b90 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
28ba0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
28bb0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
28bc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
28bd0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
28be0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
28bf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
28c00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28c10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
28c30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28c40 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
28c50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
28c60 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
28c70 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
28c80 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
28c90 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
28ca0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
28cb0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
28cc0 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
28cd0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28ce0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
28cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28d00 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
28d10 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
28d20 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
28d30 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
28d40 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
28d50 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
28d60 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
28d70 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
28d80 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
28d90 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
28da0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
28db0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
28dc0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
28dd0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
28de0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
28df0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
28e00 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
28e10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28e20 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
28e30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28e40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28e50 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
28e60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
28e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28e80 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
28e90 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
28ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28eb0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
28ec0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
28ed0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
28ee0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28ef0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
28f00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28f10 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
28f20 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
28f30 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
28f40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28f50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28f60 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28f70 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
28f80 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
28f90 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
28fa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28fc0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
28fd0 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
28fe0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
28ff0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
29000 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
29010 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a  AtLast;.      }.
29020 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
29030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29040 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29050 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
29060 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
29070 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
29080 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
29090 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
290a0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
290b0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
290c0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
290d0 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
290e0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
290f0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
29100 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
29110 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
29120 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
29130 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
29140 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
29150 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
29160 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
29170 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
29180 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
29190 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
291a0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
291b0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
291c0 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
291d0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
291e0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
291f0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
29200 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
29210 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
29220 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
29230 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
29240 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
29250 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
29260 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
29270 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
29280 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
29290 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
292a0 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
292b0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
292c0 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
292d0 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
292e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
292f0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
29300 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
29310 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
29320 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
29330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
29340 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
29350 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
29360 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
29370 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29390 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
293a0 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
293b0 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
293c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
293d0 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
293e0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
293f0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
29400 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
29410 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
29420 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
29430 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
29440 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
29450 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
29460 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
29470 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
29480 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
29490 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
294a0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
294b0 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
294c0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
294d0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
294e0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
294f0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
29500 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
29510 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
29520 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
29530 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
29540 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
29550 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
29560 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
29570 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
29580 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
29590 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
295a0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
295b0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
295c0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
295d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
295e0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
295f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
29600 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
29610 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
29620 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
29630 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29640 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29650 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
29660 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
29670 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
29680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
29690 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
296a0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
296b0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
296c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
296d0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
296e0 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
296f0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
29700 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
29710 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
29720 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
29730 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
29740 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
29750 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29760 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
29770 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29780 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
29790 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
297a0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
297b0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
297c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
297d0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
297e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
297f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43     }.    if( (pC
29810 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
29820 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26  TCF_AtLast)!=0 &
29830 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
29840 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
29850 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
29860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29870 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
29880 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
29890 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
298a0 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
298b0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
298c0 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
298d0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
298e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
298f0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
29900 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
29910 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
29920 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
29930 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
29940 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
29950 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
29960 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
29970 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
29980 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
29990 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
299a0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
299b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
299c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
299d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
299e0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
299f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29a00 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
29a10 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
29a20 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
29a30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29a40 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
29a50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
29a70 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61  VALID || pCur->a
29a80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29a90 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
29aa0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29ab0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
29ac0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
29ad0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
29ae0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
29af0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
29b00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29b10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
29b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29b30 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
29b40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
29b50 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
29b60 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
29b70 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
29b80 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
29b90 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
29ba0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29bb0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29bc0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
29bd0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29c00 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
29c10 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
29c20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
29c30 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
29c40 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
29c50 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
29c60 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
29c70 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
29c80 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
29c90 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
29ca0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
29cb0 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
29cc0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
29cd0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
29ce0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
29cf0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
29d00 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
29d10 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
29d20 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
29d30 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
29d40 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
29d50 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
29d60 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
29d70 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
29d80 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
29d90 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
29da0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
29db0 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
29dc0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
29dd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29de0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
29df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29e00 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
29e10 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
29e20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
29e30 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
29e40 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
29e50 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
29e60 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
29e70 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
29e80 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
29e90 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
29ea0 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
29eb0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
29ec0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29ed0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29ee0 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
29ef0 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
29f00 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
29f10 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
29f20 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
29f30 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
29f40 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
29f50 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
29f60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29f70 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
29f80 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
29f90 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
29fa0 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
29fb0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
29fc0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
29fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29fe0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a000 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2a010 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2a020 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2a030 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2a040 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2a050 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2a060 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2a070 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2a080 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2a090 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a0a0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2a0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2a0c0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2a0d0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2a0e0 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2a0f0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2a100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2a110 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2a120 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2a130 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a140 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2a150 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2a160 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2a170 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2a180 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2a190 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2a1a0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2a1b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2a1c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2a1d0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2a1e0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2a1f0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2a200 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2a210 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a220 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a230 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a240 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2a250 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2a260 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2a270 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a280 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2a290 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2a2a0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2a2b0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2a2c0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2a2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2a2e0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2a2f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2a300 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2a310 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2a320 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2a330 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2a340 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2a350 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
2a360 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  PtrSize;..      
2a370 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2a380 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2a390 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2a3a0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2a3b0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2a3c0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2a3d0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2a3e0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2a3f0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2a400 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2a410 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2a420 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2a430 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2a440 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2a450 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2a460 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2a470 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2a480 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2a490 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2a4a0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2a4b0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2a4c0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2a4d0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2a4e0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2a4f0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2a500 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2a510 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2a520 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2a530 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2a540 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2a550 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2a560 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2a570 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2a580 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2a590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2a5a0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2a5b0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2a5c0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2a5d0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2a5e0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2a5f0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2a600 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2a610 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2a620 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2a630 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2a640 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2a650 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2a660 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2a670 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2a680 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2a690 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2a6a0 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2a6b0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2a6c0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2a6d0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2a6e0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2a6f0 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2a700 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2a710 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2a720 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2a730 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a740 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2a750 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2a760 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2a770 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2a780 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2a790 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2a7a0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2a7b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a7c0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2a7d0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2a7e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2a7f0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2a800 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2a810 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2a820 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2a830 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2a840 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2a850 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2a860 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2a870 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2a880 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2a890 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2a8a0 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2a8b0 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2a8c0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2a8d0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2a8e0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2a8f0 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2a900 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2a910 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2a920 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2a930 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2a940 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2a950 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a960 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2a970 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2a980 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2a990 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2a9a0 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2a9b0 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2a9c0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2a9d0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2a9e0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2a9f0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2aa00 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2aa10 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2aa20 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2aa30 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2aa40 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2aa50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2aa60 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2aa70 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2aa80 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2aa90 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2aaa0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2aab0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2aac0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2aad0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2aae0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2aaf0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2ab00 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2ab10 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2ab20 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2ab30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2ab40 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2ab50 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2ab60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2ab70 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2ab80 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2ab90 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2aba0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2abb0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2abc0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2abd0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2abe0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2abf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ac00 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2ac10 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2ac20 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2ac30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2ac40 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2ac50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ac60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ac70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2ac80 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2ac90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2aca0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2acb0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2acc0 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2acd0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2ace0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2acf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ad00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2ad10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2ad20 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2ad30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
2ad40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ad50 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2ad60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2ad70 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2ad80 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
2ad90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
2ada0 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
2adb0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2adc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2add0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2ade0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
2adf0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ae00 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2ae10 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2ae20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2ae30 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
2ae40 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2ae50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ae60 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2ae70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2ae80 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
2ae90 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
2aea0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
2aeb0 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
2aec0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
2aed0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2aee0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
2aef0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
2af00 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
2af10 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2af20 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
2af30 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2af40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2af50 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
2af60 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2af70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2af80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2af90 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
2afa0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2afb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2afc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2afd0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2afe0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2aff0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2b000 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
2b010 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
2b020 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2b030 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2b040 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2b050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b060 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
2b070 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2b080 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2b090 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2b0a0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2b0b0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2b0c0 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
2b0d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2b0e0 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
2b0f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2b100 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
2b110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b120 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2b130 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2b140 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
2b150 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2b160 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
2b170 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b180 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
2b190 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2b1a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2b1b0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2b1c0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2b1d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2b1e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2b1f0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2b200 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2b210 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2b220 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2b230 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2b240 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2b250 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2b260 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2b280 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2b290 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2b2a0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2b2b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2b2c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2b2d0 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2b2e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2b2f0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2b300 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2b310 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2b320 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2b330 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2b340 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2b350 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2b360 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2b370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2b390 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2b3a0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2b3b0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2b3c0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2b3d0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2b3e0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2b3f0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2b400 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2b410 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2b420 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2b430 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2b440 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2b450 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2b460 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2b470 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2b480 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2b490 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2b4a0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2b4b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b4c0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2b4d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2b4e0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2b4f0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2b500 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2b510 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2b520 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2b530 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2b540 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2b550 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2b560 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2b570 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2b580 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2b590 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2b5a0 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2b5b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2b5c0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b5d0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2b5e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2b5f0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2b600 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2b610 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2b620 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2b630 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2b640 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2b650 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2b660 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2b670 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2b680 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2b690 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2b6a0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2b6b0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2b6c0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2b6d0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2b6e0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2b6f0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2b700 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2b710 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2b720 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2b730 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2b740 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2b750 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2b760 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2b770 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2b780 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2b790 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2b7a0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2b7b0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2b7c0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2b7d0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2b7e0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2b7f0 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2b800 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2b810 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2b820 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2b830 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2b840 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2b850 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2b860 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2b870 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2b880 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2b890 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2b8a0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2b8b0 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2b8c0 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2b8d0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2b8e0 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2b8f0 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2b900 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2b910 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2b920 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2b930 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2b940 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2b950 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2b960 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2b970 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2b980 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2b990 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2b9a0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2b9b0 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2b9c0 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2b9d0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2b9e0 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2b9f0 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2ba00 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2ba10 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2ba20 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2ba30 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2ba40 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2ba50 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2ba60 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2ba70 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2ba80 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2ba90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2baa0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2bab0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2bac0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bad0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2bae0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2baf0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2bb00 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2bb10 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2bb20 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2bb30 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2bb40 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2bb50 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2bb60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2bb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bb90 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2bba0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2bbb0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2bbc0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2bbd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bbe0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2bbf0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2bc00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2bc10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2bc20 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2bc30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2bc40 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2bc50 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2bc60 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2bc70 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2bc80 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
2bc90 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2bca0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2bcb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bcc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2bcd0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2bce0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2bcf0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2bd00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bd10 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
2bd20 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
2bd30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2bd40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2bd50 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
2bd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bd70 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
2bd80 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2bd90 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
2bda0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
2bdb0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
2bdc0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
2bdd0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
2bde0 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
2bdf0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
2be00 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
2be10 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2be20 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
2be30 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
2be40 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
2be50 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2be60 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
2be70 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
2be80 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
2be90 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
2bea0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
2beb0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
2bec0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2bed0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
2bee0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2bef0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2bf00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
2bf10 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2bf20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2bf30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2bf40 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2bf50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2bf60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
2bf70 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2bf80 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2bf90 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
2bfa0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2bfb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2bfc0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2bfd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bfe0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bff0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c010 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2c020 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2c030 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2c040 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c050 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2c060 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c070 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
2c080 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2c090 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2c0a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c0b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c0c0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2c0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c0e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c0f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2c100 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2c110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c120 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2c130 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2c140 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2c150 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
2c160 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
2c170 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c180 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
2c190 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
2c1a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2c1b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2c1c0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2c1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2c1e0 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2c1f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2c200 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2c210 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2c220 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2c230 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2c240 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2c250 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2c260 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2c270 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2c280 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
2c290 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2c2a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2c2b0 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2c2c0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2c2d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2c2e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2c2f0 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
2c300 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c310 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  age])>=pPage->nC
2c320 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2c330 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c340 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  ge]--;.    retur
2c350 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2c360 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69  , pRes);.  }.  i
2c370 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2c380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c390 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2c3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2c3b0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2c3c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2c3d0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
2c3e0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
2c3f0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
2c400 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c410 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2c420 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2c430 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2c440 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2c450 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2c460 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2c470 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c480 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2c490 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2c4a0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2c4b0 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2c4c0 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2c4d0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
2c4e0 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
2c4f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2c500 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2c510 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2c520 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
2c530 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2c540 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2c550 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
2c560 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
2c570 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2c580 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2c590 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
2c5a0 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
2c5b0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2c5c0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2c5d0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2c5e0 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
2c5f0 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
2c600 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2c610 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2c620 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2c630 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2c640 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2c650 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2c660 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2c670 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2c680 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2c690 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2c6a0 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2c6b0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2c6c0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2c6d0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2c6e0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2c6f0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2c700 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2c710 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2c720 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2c730 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2c740 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2c750 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2c760 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2c770 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2c780 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2c790 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2c7a0 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2c7b0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2c7c0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2c7d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2c7e0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2c7f0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2c800 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2c810 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2c820 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2c830 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2c840 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2c850 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
2c860 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c870 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2c880 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2c890 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2c8a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2c8b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2c8c0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2c8d0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2c8e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c8f0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2c900 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2c910 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2c930 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2c940 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2c950 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2c960 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2c970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c980 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2c990 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2c9a0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2c9b0 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2c9c0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2c9d0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2c9e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c9f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2ca00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2ca10 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2ca20 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ca30 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2ca40 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2ca50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ca60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2ca70 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2ca80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ca90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2caa0 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2cab0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2cac0 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2cad0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2cae0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2caf0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2cb00 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2cb10 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2cb20 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2cb30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cb40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cb50 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2cb60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2cb70 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2cb80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2cb90 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2cba0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2cbb0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2cbc0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2cbd0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2cbe0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2cbf0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2cc00 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2cc10 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2cc20 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2cc30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2cc40 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2cc50 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2cc60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2cc70 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2cc80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2cc90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2cca0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2ccb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2ccc0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2ccd0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2cce0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2ccf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cd00 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2cd10 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2cd20 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2cd30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2cd40 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2cd50 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2cd60 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2cd70 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2cd80 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2cd90 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
2cda0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2cdb0 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
2cdc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2cdd0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2cde0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2cdf0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2ce00 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2ce10 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2ce20 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2ce30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ce40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ce50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2ce60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2ce70 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2ce80 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2ce90 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2cea0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2ceb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2cec0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ced0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2cee0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2cef0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2cf00 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2cf10 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2cf20 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2cf30 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
2cf40 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2cf50 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2cf60 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2cf70 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2cf80 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2cf90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2cfa0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2cfb0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2cfc0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49  .   || pCur->aiI
2cfd0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2cfe0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2cff0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d000 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2d010 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2d020 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2d030 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
2d040 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d050 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72  Page]--;.  retur
2d060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2d070 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2d080 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
2d090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d0a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
2d0b0 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
2d0c0 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
2d0d0 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
2d0e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
2d0f0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
2d100 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
2d110 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
2d120 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
2d130 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
2d140 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
2d150 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
2d160 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2d170 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
2d180 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2d190 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
2d1a0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
2d1b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2d1c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2d1d0 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
2d1e0 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
2d1f0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
2d200 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
2d210 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
2d220 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2d230 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
2d240 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
2d250 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2d260 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
2d270 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
2d280 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
2d290 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
2d2a0 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
2d2b0 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
2d2c0 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
2d2d0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
2d2e0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
2d2f0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
2d300 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d310 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
2d320 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
2d330 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2d340 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
2d350 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
2d360 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
2d370 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
2d380 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
2d390 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
2d3a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2d3b0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
2d3c0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
2d3d0 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
2d3e0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
2d3f0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
2d400 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
2d410 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2d420 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
2d430 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
2d440 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
2d450 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
2d460 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
2d470 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
2d480 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
2d490 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2d4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2d4b0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
2d4c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
2d4e0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
2d4f0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
2d500 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
2d510 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
2d520 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
2d530 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
2d540 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2d550 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
2d560 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
2d570 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
2d580 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2d590 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
2d5a0 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
2d5b0 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
2d5c0 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
2d5d0 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
2d5e0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
2d5f0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2d600 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
2d610 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
2d620 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2d630 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2d640 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
2d650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2d660 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
2d670 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
2d680 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
2d690 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
2d6a0 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
2d6b0 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
2d6c0 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
2d6d0 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
2d6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2d6f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2d700 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d710 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d720 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
2d730 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
2d740 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
2d750 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
2d760 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
2d770 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2d780 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
2d790 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2d7a0 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
2d7b0 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
2d7c0 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
2d7d0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2d7e0 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
2d7f0 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
2d800 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
2d810 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2d820 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
2d830 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
2d840 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2d850 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
2d860 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
2d870 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
2d880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d890 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d8a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
2d8b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2d8c0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
2d8d0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
2d8e0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
2d8f0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
2d900 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
2d910 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2d920 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
2d930 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
2d940 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
2d950 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
2d960 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
2d970 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
2d980 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
2d990 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
2d9a0 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
2d9b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2d9c0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
2d9d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2d9e0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
2d9f0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2da00 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
2da10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2da20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
2da30 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
2da40 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2da50 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
2da60 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2da70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2da80 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
2da90 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
2daa0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
2dab0 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
2dac0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2dad0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dae0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
2daf0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2db00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2db10 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2db20 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
2db30 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
2db40 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2db50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2db60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
2db70 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2db80 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2db90 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
2dba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2dbb0 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
2dbc0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2dbd0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2dbe0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
2dbf0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
2dc00 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
2dc10 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
2dc20 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
2dc30 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
2dc40 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
2dc50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2dc60 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
2dc70 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
2dc80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2dc90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2dca0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2dcb0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2dcc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
2dcd0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2dce0 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
2dcf0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
2dd00 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
2dd10 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
2dd20 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
2dd30 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
2dd40 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
2dd50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2dd60 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
2dd70 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
2dd80 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
2dd90 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
2dda0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2ddb0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2ddc0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
2ddd0 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
2dde0 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
2ddf0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
2de00 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2de10 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
2de20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2de30 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
2de40 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
2de50 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2de60 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2de70 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
2de80 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
2de90 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
2dea0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
2deb0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2dec0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2ded0 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
2dee0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2def0 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
2df00 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
2df10 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
2df20 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2df30 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
2df40 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2df50 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2df60 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
2df70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2df80 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2df90 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
2dfa0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2dfb0 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2dfc0 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
2dfd0 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
2dfe0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2dff0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
2e000 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
2e010 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
2e020 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
2e030 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
2e040 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2e050 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e060 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
2e070 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
2e080 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
2e090 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
2e0a0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20  Trunk>mxPage || 
2e0b0 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b  nSearch++ > n ){
2e0c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2e0d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2e0e0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2e0f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2e100 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2e110 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2e120 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2e130 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2e140 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
2e150 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
2e160 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2e170 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
2e180 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2e190 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
2e1a0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
2e1b0 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
2e1c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2e1d0 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
2e1e0 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
2e1f0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
2e200 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
2e210 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
2e220 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
2e230 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
2e240 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
2e250 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2e260 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2e270 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
2e280 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
2e290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
2e2a0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
2e2b0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
2e2c0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
2e2d0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
2e2e0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
2e2f0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
2e300 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
2e310 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
2e320 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
2e330 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
2e340 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
2e350 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
2e360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e370 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2e380 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2e390 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2e3a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2e3b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2e3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e3d0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
2e3e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2e3f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e400 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
2e410 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2e420 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
2e430 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
2e440 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2e450 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2e460 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2e470 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2e480 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2e490 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
2e4a0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
2e4b0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2e4c0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
2e4d0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
2e4e0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
2e4f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2e500 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
2e510 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2e520 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
2e530 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e540 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
2e550 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e560 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
2e570 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
2e580 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
2e590 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b   (nearby==iTrunk
2e5a0 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72   || (iTrunk<near
2e5b0 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
2e5c0 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
2e5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2e5e0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
2e5f0 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
2e600 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
2e610 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
2e620 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
2e630 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
2e640 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
2e650 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
2e660 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  /.        *pPgno
2e670 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2e680 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
2e690 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
2e6a0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2e6b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e6c0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2e6d0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2e6e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2e6f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2e700 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2e710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e720 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
2e730 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2e740 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2e750 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2e760 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e770 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
2e780 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2e790 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e7a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e7b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e7c0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2e7d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e7e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e7f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2e800 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2e810 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2e820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e830 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2e840 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2e850 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2e860 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2e870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e890 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
2e8a0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
2e8b0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
2e8c0 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
2e8d0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
2e8e0 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
2e8f0 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
2e900 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
2e910 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
2e920 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
2e930 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
2e940 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
2e950 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
2e960 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
2e970 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
2e980 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2e990 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
2e9a0 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
2e9b0 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
2e9c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2e9d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2e9e0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2e9f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2ea00 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2ea10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
2ea20 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
2ea30 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2ea40 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2ea50 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
2ea60 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
2ea70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
2ea80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ea90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eaa0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2eab0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2eac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ead0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2eae0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2eaf0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
2eb00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2eb10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eb20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2eb30 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2eb40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2eb50 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2eb60 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2eb70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2eb80 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2eb90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2eba0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2ebb0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
2ebc0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
2ebd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
2ebe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
2ebf0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2ec00 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
2ec10 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
2ec20 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
2ec30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2ec40 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2ec50 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2ec60 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2ec70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2ec80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ec90 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
2eca0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
2ecb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2ecc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2ecd0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2ece0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ecf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ed00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ed10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2ed20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ed30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ed40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2ed50 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2ed60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
2ed80 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2ed90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
2eda0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2edb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2edc0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2edd0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2ede0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2edf0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2ee00 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2ee10 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
2ee20 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
2ee30 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
2ee40 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
2ee50 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
2ee60 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
2ee70 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
2ee80 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
2ee90 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
2eea0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
2eeb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
2eec0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2eed0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2eee0 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
2eef0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
2ef00 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
2ef10 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2ef20 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2ef30 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2ef40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ef50 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2ef60 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2ef80 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
2ef90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2efa0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2efd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2efe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2eff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f000 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
2f010 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
2f020 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
2f030 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2f040 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2f050 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2f060 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
2f070 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2f080 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
2f090 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2f0a0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
2f0b0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
2f0c0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
2f0d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2f0e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2f0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2f100 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
2f110 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2f120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f140 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f150 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2f160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2f170 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
2f180 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
2f190 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
2f1a0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
2f1b0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2f1c0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
2f1d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
2f1e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f1f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f200 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f210 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
2f230 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2f240 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2f250 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
2f260 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
2f270 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
2f280 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
2f290 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2f2a0 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
2f2b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
2f2c0 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
2f2d0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
2f2e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
2f2f0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f300 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
2f310 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
2f320 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2f330 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
2f340 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
2f360 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
2f370 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
2f380 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
2f390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f3a0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2f3b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f3c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2f3d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2f3e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2f3f0 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
2f400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f410 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
2f420 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
2f430 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
2f440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f450 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
2f460 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2f470 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
2f480 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
2f490 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
2f4a0 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54  Pgno)? PAGER_GET
2f4b0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
2f4c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2f4d0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f4e0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2f4f0 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
2f500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2f510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2f530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f540 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2f550 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2f560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f580 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2f590 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70               *pp
2f5b0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2f5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f5d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
2f5e0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2f5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f600 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f610 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2f620 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2f630 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
2f640 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
2f650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2f660 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
2f670 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2f680 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
2f690 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
2f6a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2f6b0 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
2f6c0 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
2f6d0 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
2f6e0 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
2f6f0 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
2f700 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
2f710 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
2f720 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
2f730 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
2f740 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
2f750 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
2f760 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
2f770 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
2f780 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
2f790 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
2f7a0 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
2f7b0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2f7c0 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
2f7d0 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
2f7e0 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
2f7f0 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
2f800 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
2f810 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
2f820 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
2f830 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
2f840 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
2f850 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2f860 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
2f870 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
2f880 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
2f890 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
2f8a0 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
2f8b0 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
2f8c0 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
2f8d0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
2f8e0 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
2f8f0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
2f900 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2f910 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
2f920 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
2f930 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
2f940 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
2f950 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
2f960 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
2f970 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
2f980 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2f990 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
2f9a0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
2f9b0 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
2f9c0 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
2f9d0 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
2f9e0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
2f9f0 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
2fa00 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
2fa10 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
2fa20 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
2fa30 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2fa40 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
2fa50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2fa60 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
2fa70 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
2fa80 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
2fa90 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
2faa0 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  e))? PAGER_GET_N
2fab0 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20  OCONTENT:0;..   
2fac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fad0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2fae0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2faf0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2fb00 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2fb10 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2fb20 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2fb30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2fb40 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2fb50 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2fb60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2fb70 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2fb80 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2fb90 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2fba0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2fbb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2fbc0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2fbd0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2fbe0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2fbf0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2fc00 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2fc10 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2fc20 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2fc30 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2fc40 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2fc50 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2fc60 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2fc70 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2fc80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2fc90 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2fca0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2fcb0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2fcc0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2fcd0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2fce0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2fcf0 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2fd00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2fd10 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2fd20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2fd30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2fd40 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2fd50 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2fd60 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2fd70 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
2fd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fda0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fdb0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
2fdc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2fdd0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
2fde0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2fdf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2fe00 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2fe10 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2fe20 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2fe30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
2fe40 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
2fe50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
2fe60 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
2fe70 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
2fe80 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
2fe90 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
2fea0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
2feb0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2fec0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2fed0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
2fee0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2fef0 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
2ff00 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43  no, ppPage, bNoC
2ff10 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  ontent);.    if(
2ff20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ff30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ff40 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2ff50 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2ff60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ff70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ff80 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2ff90 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
2ffa0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  age = 0;.    }. 
2ffb0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2ffc0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2ffd0 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2ffe0 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2fff0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
30000 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
30010 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
30020 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
30030 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
30040 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
30050 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
30060 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
30070 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
30080 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
30090 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
300a0 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73  Page)<=1 );.  as
300b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
300c0 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  _OK || (*ppPage)
300d0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
300e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
300f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
30100 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
30110 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
30120 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30130 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
30140 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
30150 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
30160 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
30170 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
30180 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
30190 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
301a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
301b0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
301c0 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
301d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
301e0 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
301f0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
30200 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
30210 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
30220 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
30230 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
30240 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
30250 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
30260 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
30270 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
30280 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
30290 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
302a0 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
302b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
302c0 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
302d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
302e0 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
302f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
30300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
30310 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
30320 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
30330 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
30340 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
30350 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
30360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30370 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
30380 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
30390 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
303a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
303b0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
303c0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
303d0 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
303e0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
303f0 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
30400 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
30410 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
30420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
30430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30440 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
30450 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
30460 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
30470 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30490 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
304a0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
304b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
304d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
304e0 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
304f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
30500 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30510 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
30520 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
30530 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29  _DB || iPage>1 )
30540 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
30550 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
30560 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
30570 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32  ;..  if( iPage<2
30580 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30590 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
305a0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
305b0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
305c0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
305d0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
305e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
305f0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
30600 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
30610 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
30620 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
30630 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
30640 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
30650 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
30660 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
30670 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
30680 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
30690 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
306a0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
306b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
306c0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
306d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
306e0 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
306f0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
30700 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
30710 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
30720 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
30730 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
30740 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
30750 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
30760 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
30770 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
30780 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
30790 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
307a0 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
307b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
307c0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
307d0 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
307e0 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
307f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30800 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
30810 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
30820 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
30830 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
30840 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
30850 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
30860 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
30870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30880 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
30890 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
308a0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
308b0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
308c0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
308d0 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
308e0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
308f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
30900 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
30910 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
30920 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
30930 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
30940 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
30950 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
30960 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
30970 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
30980 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
30990 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
309a0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
309b0 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
309c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
309d0 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
309e0 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
309f0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
30a00 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
30a10 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
30a20 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
30a30 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
30a40 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
30a50 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
30a60 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
30a70 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
30a80 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
30a90 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
30aa0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
30ab0 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
30ac0 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
30ad0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
30ae0 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
30af0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
30b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
30b10 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
30b20 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
30b30 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
30b40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
30b50 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
30b60 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
30b70 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
30b80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
30b90 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
30ba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
30bb0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
30bc0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
30bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30be0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
30bf0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
30c00 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
30c10 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
30c20 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
30c30 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
30c40 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
30c50 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
30c60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
30c70 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
30c80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30c90 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
30ca0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
30cb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
30cc0 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
30cd0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
30ce0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
30cf0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
30d00 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
30d10 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
30d20 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
30d30 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
30d40 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
30d50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30d60 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
30d70 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
30d80 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
30d90 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
30da0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
30db0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
30dc0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
30dd0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
30de0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
30df0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
30e00 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
30e10 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
30e20 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
30e30 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
30e40 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
30e50 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
30e60 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
30e70 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
30e80 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
30e90 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
30ea0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
30eb0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
30ec0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
30ed0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
30ee0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
30ef0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
30f00 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
30f10 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
30f20 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
30f30 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
30f40 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
30f50 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
30f60 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
30f70 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
30f80 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
30f90 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
30fa0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
30fb0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
30fc0 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
30fd0 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
30fe0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
30ff0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
31000 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
31010 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
31020 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
31030 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
31040 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
31050 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
31060 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
31070 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
31080 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
31090 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
310a0 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
310b0 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
310c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
310d0 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
310e0 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
310f0 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
31100 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
31110 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
31120 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
31130 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
31140 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
31150 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31170 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
31180 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
311a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
311b0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
311c0 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
311d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
311e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
311f0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
31200 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
31210 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
31220 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
31230 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
31240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31250 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
31260 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
31270 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
31280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
31290 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
312a0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
312b0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
312c0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
312d0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
312e0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
312f0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
31300 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
31310 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31320 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
31330 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
31340 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
31350 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
31360 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
31370 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
31380 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
31390 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
313a0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
313b0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
313c0 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
313d0 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
313e0 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
313f0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
31400 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
31410 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
31420 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
31430 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
31440 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
31450 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
31460 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
31470 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
31480 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
31490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
314a0 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
314b0 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
314c0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
314d0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
314e0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
314f0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
31500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31510 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31520 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
31530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31540 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31550 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
31560 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
31570 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
31580 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
31590 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
315a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
315b0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
315c0 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
315d0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
315e0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
315f0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
31600 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
31610 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
31620 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
31630 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
31640 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
31650 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
31660 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31670 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
31680 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
31690 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
316a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
316b0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
316c0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
316d0 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
316e0 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
316f0 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
31700 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
31710 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
31720 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
31730 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
31740 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
31750 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
31760 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
31770 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
31780 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
31790 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
317a0 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
317b0 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
317c0 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
317d0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
317e0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
317f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
31800 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
31810 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
31820 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
31830 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
31840 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36  he Cell */.  u16
31850 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
31860 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
31870 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43  he size of the C
31880 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ell here */.){. 
31890 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
318a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
318b0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
318c0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
318d0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
318e0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
318f0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
31900 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31910 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
31920 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31930 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
31940 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
31950 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a  &info);.  *pnSiz
31960 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
31970 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
31980 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
31990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
319a0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
319b0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
319c0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
319d0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
319e0 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
319f0 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
31a00 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
31a10 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
31a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
31a30 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
31a40 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
31a50 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
31a60 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
31a70 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
31a80 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
31a90 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
31aa0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
31ab0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
31ac0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
31ad0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
31ae0 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
31af0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
31b00 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
31b10 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
31b20 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
31b30 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
31b40 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e  ORRUPT_DB && (in
31b50 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76  fo.nPayload + ov
31b60 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c  flPageSize)<ovfl
31b70 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20  PageSize).  );. 
31b80 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
31b90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
31ba0 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
31bb0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
31bc0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
31bd0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
31be0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
31bf0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
31c00 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
31c10 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
31c20 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
31c30 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
31c40 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
31c50 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
31c60 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
31c70 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
31c80 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
31c90 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
31ca0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
31cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
31cc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31cd0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
31ce0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
31cf0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
31d00 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
31d10 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
31d20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
31d30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
31d40 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
31d50 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
31d60 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
31d70 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
31d80 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
31d90 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
31da0 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
31db0 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
31dc0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
31dd0 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
31de0 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
31df0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
31e00 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
31e10 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
31e20 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
31e30 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
31e40 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
31e50 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
31e60 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
31e70 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
31e80 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
31e90 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
31ea0 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
31eb0 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
31ec0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
31ed0 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
31ee0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
31ef0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
31f00 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
31f10 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
31f20 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
31f30 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
31f40 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
31f50 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
31f60 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
31f70 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
31f80 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
31f90 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
31fa0 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
31fb0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
31fc0 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
31fd0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
31fe0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
31ff0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
32000 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
32010 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
32020 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
32030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
32040 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
32050 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
32060 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
32070 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
32080 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
32090 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
320a0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
320b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
320c0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
320d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
320e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
320f0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
32100 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
32110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32120 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
32130 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
32140 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
32150 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
32160 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
32170 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
32180 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
32190 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
321a0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
321b0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
321c0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
321d0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
321e0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
321f0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
32200 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
32210 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
32220 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
32230 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
32240 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
32250 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
32260 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
32270 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
32280 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
32290 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
322a0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
322b0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
322c0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
322d0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
322e0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
322f0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
32300 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
32310 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
32320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
32330 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
32340 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
32350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
32360 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
32370 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
32380 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32390 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
323a0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
323b0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
323c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
323d0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
323e0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
323f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
32400 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
32410 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
32420 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32440 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
32450 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
32460 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
32470 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
32480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32490 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
324a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
324b0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
324c0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
324d0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
324e0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
324f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
32500 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
32510 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
32520 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
32530 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
32540 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
32550 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
32560 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32570 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
32580 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
32590 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
325a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
325b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
325c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
325d0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
325e0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
325f0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
32600 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
32610 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
32620 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
32630 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
32640 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
32650 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
32660 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
32670 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
32680 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
32690 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
326a0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
326b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
326c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
326d0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
326e0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
326f0 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
32700 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
32710 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
32720 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
32730 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
32740 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  Leaf ){.    nHea
32750 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
32760 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
32770 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
32780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
32790 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a  rt( nData==0 );.
327a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72      assert( nZer
327b0 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48  o==0 );.  }.  nH
327c0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
327d0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
327e0 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
327f0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
32800 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73  in the payload s
32810 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ize */.  if( pPa
32820 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
32830 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
32840 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
32850 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
32860 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
32870 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
32880 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
32890 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
328a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
328b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
328c0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
328d0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
328e0 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
328f0 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
32900 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c  .  }.  if( nPayl
32910 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
32920 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
32930 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
32940 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
32950 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
32960 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
32970 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
32980 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
32990 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
329a0 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
329b0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
329c0 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
329d0 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
329e0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
329f0 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
32a00 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
32a10 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32a20 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
32a30 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
32a40 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
32a50 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
32a60 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
32a70 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
32a80 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
32a90 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
32aa0 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
32ab0 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
32ac0 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
32ad0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
32ae0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
32af0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
32b00 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
32b10 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
32b20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
32b30 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
32b40 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
32b50 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
32b60 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
32b70 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
32b80 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
32b90 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
32ba0 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
32bb0 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
32bc0 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
32bd0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
32be0 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
32bf0 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
32c00 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
32c20 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
32c30 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
32c40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
32c50 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
32c60 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
32c70 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
32c80 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
32c90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
32ca0 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
32cb0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
32cc0 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
32cd0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
32ce0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
32cf0 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
32d00 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
32d10 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
32d20 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
32d30 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
32d40 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
32d50 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
32d60 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
32d70 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
32d80 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
32d90 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
32da0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
32db0 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
32dc0 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  er=(int)(info.pP
32dd0 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
32de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
32df0 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
32e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
32e10 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53  nSize == info.nS
32e20 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
32e30 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20  t( spaceLeft == 
32e40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20  info.nLocal );. 
32e50 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
32e60 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  r == &pCell[info
32e70 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20  .iOverflow] );. 
32e80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32e90 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61  Write the payloa
32ea0 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  d into the local
32eb0 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78   Cell and any ex
32ec0 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  tra into overflo
32ed0 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69  w pages */.  whi
32ee0 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
32ef0 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
32f00 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
32f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32f20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
32f30 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
32f40 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
32f50 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
32f60 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
32f70 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
32f80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32f90 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
32fa0 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
32fb0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
32fc0 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
32fd0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
32fe0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
32ff0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
33000 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33010 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
33020 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33030 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
33040 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
33050 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
33060 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
33070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33080 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33090 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
330a0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
330b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
330c0 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
330d0 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
330e0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
330f0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
33100 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
33110 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
33120 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
33130 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
33140 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
33150 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
33160 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
33170 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
33180 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
33190 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
331a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
331b0 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
331c0 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
331d0 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
331e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
331f0 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
33200 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
33210 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
33220 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
33230 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
33240 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  the uninitialize
33250 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
33260 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
33270 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
33280 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
33290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
332a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
332b0 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
332c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
332d0 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
332e0 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
332f0 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
33300 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
33310 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
33320 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
33330 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
33340 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
33350 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
33360 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
33370 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
33380 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33390 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
333a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
333b0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
333c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
333d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
333e0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
333f0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
33400 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
33410 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
33420 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
33430 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
33440 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
33450 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
33460 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
33470 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
33480 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
33490 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
334a0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
334b0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
334c0 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
334d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
334e0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
334f0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
33500 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
33510 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
33520 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
33530 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
33540 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
33550 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
33560 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
33570 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
33580 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33590 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
335a0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
335b0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
335c0 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
335d0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
335e0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
335f0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
33600 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
33610 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
33620 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
33630 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
33640 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
33650 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
33660 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
33670 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
33680 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
33690 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
336a0 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
336b0 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
336c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
336d0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
336e0 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
336f0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
33700 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
33710 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
33720 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
33730 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
33740 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
33750 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
33760 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
33770 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33780 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
33790 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
337a0 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
337b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
337c0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
337d0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
337e0 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
337f0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
33800 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33810 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
33820 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
33830 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
33840 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
33850 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
33860 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33870 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
33880 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
33890 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
338a0 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
338b0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
338c0 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
338d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
338e0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
338f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33900 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
33910 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
33920 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
33930 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
33940 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
33950 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
33960 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
33970 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
33980 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
33990 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
339a0 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
339b0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
339c0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
339d0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
339e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
339f0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
33a00 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
33a10 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
33a20 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
33a30 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
33a40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
33a50 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
33a60 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
33a70 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
33a80 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
33a90 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
33aa0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
33ab0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
33ac0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
33ad0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
33ae0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
33af0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
33b00 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
33b10 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
33b20 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
33b30 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
33b40 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
33b50 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
33b60 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
33b70 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
33b80 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
33b90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
33ba0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
33bb0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
33bc0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
33bd0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
33be0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
33bf0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
33c00 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
33c10 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
33c20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33c30 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
33c40 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
33c50 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
33c60 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
33c70 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
33c80 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
33c90 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
33ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
33cb0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
33cc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
33cd0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
33ce0 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  | sz==cellSize(p
33cf0 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
33d00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33d10 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33d20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
33d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33d40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33d50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33d60 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
33d70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
33d80 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
33d90 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20  llIdx[2*idx];.  
33da0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
33db0 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
33dc0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
33dd0 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
33de0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
33df0 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
33e00 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
33e10 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33e20 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
33e30 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
33e40 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
33e50 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
33e60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
33e70 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
33e80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33e90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
33ea0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
33eb0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
33ec0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
33ed0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
33ee0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
33ef0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
33f00 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
33f10 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  l==0 ){.    mems
33f20 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
33f30 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61   0, 4);.    data
33f40 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20  [hdr+7] = 0;.   
33f50 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
33f60 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70  hdr+5], pPage->p
33f70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
33f80 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
33f90 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
33fa0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61  usableSize - pPa
33fb0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20  ge->hdrOffset.  
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fd0 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68       - pPage->ch
33fe0 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a  ildPtrSize - 8;.
33ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
34000 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c  move(ptr, ptr+2,
34010 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   2*(pPage->nCell
34020 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75   - idx));.    pu
34030 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
34040 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
34050 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  l);.    pPage->n
34060 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d  Free += 2;.  }.}
34070 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
34080 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
34090 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
340a0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
340b0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
340c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
340d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
340e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
340f0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
34100 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
34110 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
34120 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
34130 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
34140 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
34150 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
34160 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
34170 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
34180 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
34190 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
341a0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
341b0 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  pOvfl[] and make
341c0 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
341d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
341e0 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
341f0 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
34200 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
34210 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
34220 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
34230 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
34240 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
34250 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
34260 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
34270 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
34280 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
34290 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
342a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
342b0 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
342c0 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
342d0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
342e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
342f0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
34300 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
34310 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
34320 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
34330 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
34340 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
34350 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
34360 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
34370 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
34380 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
34390 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
343a0 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
343b0 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
343c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
343d0 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
343e0 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
343f0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
34400 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
34410 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
34420 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
34430 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
34440 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
34450 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
34460 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
34470 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
34480 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
34490 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
344a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
344b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
344c0 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
344d0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
344e0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
344f0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
34500 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
34510 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
34520 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
34530 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
34540 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
34550 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
34560 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
34570 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
34580 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
34590 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
345a0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
345b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
345c0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 0a   whole page */..
345d0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
345e0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
345f0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
34600 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
34610 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
34620 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50  sert( MX_CELL(pP
34630 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
34640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34650 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
34660 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
34670 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
34680 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34690 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
346a0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
346b0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
346c0 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
346d0 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
346e0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
346f0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
34700 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
34710 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
34720 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
34730 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
34740 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
34750 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
34760 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
34770 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
34780 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
34790 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
347a0 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
347b0 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
347c0 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
347d0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
347e0 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
347f0 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
34800 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
34810 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
34820 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
34830 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
34840 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
34850 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
34860 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
34870 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
34880 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
34890 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
348a0 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  ==pPage->xCellSi
348b0 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ze(pPage, pCell)
348c0 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
348d0 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
348e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
348f0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
34900 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
34910 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
34920 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70   memcpy(pTemp, p
34930 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20  Cell, sz);.     
34940 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
34950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
34960 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
34970 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
34980 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
34990 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
349a0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
349b0 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
349c0 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
349d0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
349e0 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  >apOvfl[0])) );.
349f0 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66      pPage->apOvf
34a00 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  l[j] = pCell;.  
34a10 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b    pPage->aiOvfl[
34a20 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20  j] = (u16)i;..  
34a30 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70    /* When multip
34a40 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63  le overflows occ
34a50 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77  ur, they are alw
34a60 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61  ays sequential a
34a70 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72  nd in.    ** sor
34a80 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ted order.  This
34a90 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73   invariants aris
34aa0 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70  e because multip
34ab0 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e  le overflows can
34ac0 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63  .    ** only occ
34ad0 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e  ur when insertin
34ae0 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  g divider cells 
34af0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
34b00 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20  page during.    
34b10 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e  ** balancing, an
34b20 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61  d the dividers a
34b30 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20  re adjacent and 
34b40 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  sorted..    */. 
34b50 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
34b60 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  || pPage->aiOvfl
34b70 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20  [j-1]<(u16)i ); 
34b80 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20  /* Overflows in 
34b90 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a  sorted order */.
34ba0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
34bb0 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69   || i==pPage->ai
34bc0 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20  Ovfl[j-1]+1 );  
34bd0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72   /* Overflows ar
34be0 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a  e sequential */.
34bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
34c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34c10 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
34c20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
34c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34c40 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
34c50 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
34c60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
34c70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
34c80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
34c90 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34ca0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
34cb0 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
34cc0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
34cd0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
34ce0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
34cf0 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
34d00 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
34d10 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
34d20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
34d30 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
34d40 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
34d50 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
34d60 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
34d70 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
34d80 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
34d90 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
34da0 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73  owing properties
34db0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
34dc0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
34dd0 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ly */.    assert
34de0 28 20 69 64 78 20 3e 3d 20 30 20 26 26 20 28 69  ( idx >= 0 && (i
34df0 64 78 20 3e 3d 20 65 6e 64 2b 32 20 7c 7c 20 43  dx >= end+2 || C
34e00 4f 52 52 55 50 54 5f 44 42 29 20 29 3b 0a 20 20  ORRUPT_DB) );.  
34e10 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a    assert( idx+sz
34e20 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
34e30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34e40 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
34e50 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
34e60 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
34e70 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
34e80 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c  mcpy(&data[idx],
34e90 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
34ea0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
34eb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
34ec0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
34ed0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  );.    }.    mem
34ee0 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32  move(&data[ins+2
34ef0 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65  ], &data[ins], e
34f00 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74  nd-ins);.    put
34f10 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
34f20 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
34f30 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
34f40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
34f50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
34f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34f70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34f80 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
34f90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
34fb0 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
34fc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
34fd0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
34fe0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
34ff0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
35000 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
35010 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
35020 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
35030 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
35040 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
35050 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
35060 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
35070 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72  ./*.** A CellArr
35080 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  ay object contai
35090 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f  ns a cache of po
350a0 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73  inters and sizes
350b0 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63   for a.** consec
350c0 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f  utive sequence o
350d0 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67  f cells that mig
350e0 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c 74 69  ht be held multi
350f0 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79  ple pages..*/.ty
35100 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c  pedef struct Cel
35110 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79  lArray CellArray
35120 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72  ;.struct CellArr
35130 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ay {.  int nCell
35140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35150 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
35160 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
35170 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66  .  MemPage *pRef
35180 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
35190 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a  ference page */.
351a0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
351b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
351c0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
351d0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
351e0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
351f0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
35200 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
35210 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a   apCell[] */.};.
35220 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
35230 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20   the cell sizes 
35240 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e  at idx, idx+1, .
35250 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65  .., idx+N-1 have
35260 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65   been.** compute
35270 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
35280 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61  d populateCellCa
35290 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  che(CellArray *p
352a0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e  , int idx, int N
352b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ){.  assert( idx
352c0 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d  >=0 && idx+N<=p-
352d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c  >nCell );.  whil
352e0 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73  e( N>0 ){.    as
352f0 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b  sert( p->apCell[
35300 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  idx]!=0 );.    i
35310 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78  f( p->szCell[idx
35320 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  ]==0 ){.      p-
35330 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70  >szCell[idx] = p
35340 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
35350 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
35360 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20  Cell[idx]);.    
35370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
35380 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
35390 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
353a0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
353b0 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53  =p->pRef->xCellS
353c0 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
353d0 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a  apCell[idx]) );.
353e0 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b      }.    idx++;
353f0 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    N--;.  }.}.
35400 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35410 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74  e size of the Nt
35420 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
35430 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73   cell array.*/.s
35440 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
35450 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74  NLINE u16 comput
35460 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  eCellSize(CellAr
35470 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
35480 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
35490 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
354a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43    assert( p->szC
354b0 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70  ell[N]==0 );.  p
354c0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d  ->szCell[N] = p-
354d0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
354e0 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
354f0 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72  ell[N]);.  retur
35500 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
35510 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61 63  }.static u16 cac
35520 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  hedCellSize(Cell
35530 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
35540 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
35550 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
35560 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c  ;.  if( p->szCel
35570 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d  l[N] ) return p-
35580 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65  >szCell[N];.  re
35590 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c  turn computeCell
355a0 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f  Size(p, N);.}../
355b0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
355c0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
355d0 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62  nters to nCell b
355e0 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73  -tree page cells
355f0 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c  . The .** szCell
35600 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
35610 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
35620 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c  tes of each cell
35630 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
35640 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  ** replaces the 
35650 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
35660 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74   of page pPg wit
35670 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
35680 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72  f the cell.** ar
35690 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20  ray..**.** Some 
356a0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  of the cells in 
356b0 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72  apCell[] may cur
356c0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
356d0 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a   in pPg. This.**
356e0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
356f0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
35700 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62  caused by this b
35710 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  y making a copy 
35720 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20  of any .** such 
35730 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65  cells before ove
35740 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67  rwriting the pag
35750 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  e data..**.** Th
35760 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20  e MemPage.nFree 
35770 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
35780 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
35790 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65  ction. It is the
357a0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
357b0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
357c0 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
357d0 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
357e0 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65   int rebuildPage
357f0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
35800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35810 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
35820 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
35830 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
35840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
35850 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  nal number of ce
35860 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  lls on page */. 
35870 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35890 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
358a0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
358b0 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
358c0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
358d0 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
358e0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
358f0 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
35900 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
35910 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
35920 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  der on pPg */.  
35930 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
35940 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
35950 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
35960 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
35970 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  pPg */.  const i
35980 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
35990 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
359a0 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Size;.  u8 * con
359b0 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
359c0 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
359d0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65  int i;.  u8 *pCe
359e0 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
359f0 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d  llIdx;.  u8 *pTm
35a00 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
35a10 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
35a20 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75  Bt->pPager);.  u
35a30 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d  8 *pData;..  i =
35a40 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
35a50 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
35a60 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44  py(&pTmp[i], &aD
35a70 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69  ata[i], usableSi
35a80 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74  ze - i);..  pDat
35a90 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28  a = pEnd;.  for(
35aa0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
35ab0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
35ac0 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
35ad0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61     if( pCell>aDa
35ae0 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64  ta && pCell<pEnd
35af0 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   ){.      pCell 
35b00 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20  = &pTmp[pCell - 
35b10 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20  aData];.    }.  
35b20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c    pData -= szCel
35b30 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  l[i];.    put2by
35b40 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44  te(pCellptr, (pD
35b50 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  ata - aData));. 
35b60 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
35b70 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
35b80 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74  < pCellptr ) ret
35b90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35ba0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d  PT_BKPT;.    mem
35bb0 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c  cpy(pData, pCell
35bc0 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , szCell[i]);.  
35bd0 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c    assert( szCell
35be0 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]==pPg->xCellS
35bf0 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20  ize(pPg, pCell) 
35c00 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
35c10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
35c20 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78  zCell[i]!=pPg->x
35c30 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65  CellSize(pPg,pCe
35c40 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ll) );.  }..  /*
35c50 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
35c60 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74  field is now set
35c70 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68   incorrectly. Th
35c80 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69  e caller will fi
35c90 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  x it. */.  pPg->
35ca0 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20  nCell = nCell;. 
35cb0 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
35cc0 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
35cd0 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20  (&aData[hdr+1], 
35ce0 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  0);.  put2byte(&
35cf0 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
35d00 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
35d10 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
35d20 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
35d30 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72  ta);.  aData[hdr
35d40 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65  +7] = 0x00;.  re
35d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35d60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
35d70 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
35d80 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20   nCell pointers 
35d90 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e  to b-tree cells.
35da0 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a   Array szCell.**
35db0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
35dc0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
35dd0 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
35de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
35df0 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64  empts to .** add
35e00 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65   the cells store
35e10 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  d in the array t
35e20 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69  o page pPg. If i
35e30 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73  t cannot (becaus
35e40 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  e .** the page n
35e50 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61  eeds to be defra
35e60 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74  gmented before t
35e70 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69  he cells will fi
35e80 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20  t), non-zero.** 
35e90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
35ea0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
35eb0 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73  ells are added s
35ec0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72  uccessfully, zer
35ed0 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  o is.** returned
35ee0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
35ef0 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73   pCellptr points
35f00 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
35f10 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  try in the cell-
35f20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a  pointer array.**
35f30 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70   (part of page p
35f40 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e  Pg) to populate.
35f50 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65   After cell apCe
35f60 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e  ll[0] is written
35f70 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   to the.** page 
35f80 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f  body, a 16-bit o
35f90 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e  ffset is written
35fa0 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e   to pCellptr. An
35fb0 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63  d so on, for eac
35fc0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65  h.** cell in the
35fd0 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68   array. It is th
35fe0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
35ff0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
36000 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
36010 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
36020 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61  verwrite this pa
36030 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70  rt of the cell-p
36040 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a  ointer array..**
36050 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
36060 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
36070 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73  , *ppData points
36080 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
36090 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
360a0 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50   area on page pP
360b0 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  g. If the size o
360c0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
360d0 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a  ea is extended,.
360e0 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70  ** *ppData is up
360f0 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  dated to point t
36100 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20  o the new start 
36110 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
36120 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  rea.** before re
36130 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46  turning..**.** F
36140 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74  inally, argument
36150 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74   pBegin points t
36160 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64  o the byte immed
36170 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
36180 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
36190 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
361a0 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66  d by this page f
361b0 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  or the cell-poin
361c0 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a  ter area (for.**
361d0 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74   all cells - not
361e0 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65   just those inse
361f0 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  rted by the curr
36200 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68  ent call). If th
36210 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65  e content.** are
36220 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64  a must be extend
36230 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69  ed to before thi
36240 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
36250 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61   to accomodate a
36260 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61  ll.** cells in a
36270 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68  pCell[], then th
36280 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66  e cells do not f
36290 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  it and non-zero 
362a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
362b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
362c0 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65  nsertArray(.  Me
362d0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
362e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
362f0 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c   Page to add cel
36300 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70  ls to */.  u8 *p
36310 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20  Begin,          
36320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
36330 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  d of cell-pointe
36340 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20  r array */.  u8 
36350 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20  **ppData,       
36360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36370 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e  IN/OUT: Page con
36380 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74  tent -area point
36390 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
363a0 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  lptr,           
363b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
363c0 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74  er to cell-point
363d0 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  er area */.  int
363e0 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36400 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
36410 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  ell to add */.  
36420 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
36450 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
36460 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
36470 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
36480 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36490 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  f cells */.){.  
364a0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61  int i;.  u8 *aDa
364b0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
364c0 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a  .  u8 *pData = *
364d0 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ppData;.  const 
364e0 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20  int bFreelist = 
364f0 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74  aData[1] || aDat
36500 61 5b 32 5d 3b 0a 20 20 69 6e 74 20 69 45 6e 64  a[2];.  int iEnd
36510 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
36520 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  l;.  assert( COR
36530 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e  RUPT_DB || pPg->
36540 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  hdrOffset==0 ); 
36550 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
36560 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a  ed on page 1 */.
36570 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
36580 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<iEnd; i++){.  
36590 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20    int sz, rc;.  
365a0 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20    u8 *pSlot;.   
365b0 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c   sz = cachedCell
365c0 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29  Size(pCArray, i)
365d0 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c  ;.    if( bFreel
365e0 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74  ist==0 || (pSlot
365f0 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
36600 70 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29  pPg, sz, &rc, 0)
36610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  )==0 ){.      pD
36620 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20  ata -= sz;.     
36630 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
36640 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  n ) return 1;.  
36650 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
36660 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  a;.    }.    mem
36670 63 70 79 28 70 53 6c 6f 74 2c 20 70 43 41 72 72  cpy(pSlot, pCArr
36680 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  ay->apCell[i], s
36690 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  z);.    put2byte
366a0 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f  (pCellptr, (pSlo
366b0 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  t - aData));.   
366c0 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
366d0 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20    }.  *ppData = 
366e0 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  pData;.  return 
366f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
36700 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
36710 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
36720 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
36730 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
36740 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68   .** contains th
36750 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
36760 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
36770 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
36780 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61   adds the.** spa
36790 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ce associated wi
367a0 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20  th each cell in 
367b0 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69  the array that i
367c0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
367d0 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ed .** within th
367e0 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f  e body of pPg to
367f0 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69   the pPg free-li
36800 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69  st. The cell-poi
36810 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a  nters and other.
36820 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ** fields of the
36830 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70   page are not up
36840 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dated..**.** Thi
36850 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
36860 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
36870 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64  ber of cells add
36880 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
36890 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
368a0 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79  nt pageFreeArray
368b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
368c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
368d0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65      /* Page to e
368e0 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  dit */.  int iFi
368f0 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
36900 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
36910 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  t cell to delete
36920 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
36930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36940 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74        /* Cells t
36950 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65  o delete */.  Ce
36960 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
36970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36980 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
36990 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
369a0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
369b0 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
369c0 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
369d0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
369e0 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
369f0 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
36a00 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
36a10 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
36a20 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
36a30 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
36a40 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45   int i;.  int iE
36a50 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43  nd = iFirst + nC
36a60 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  ell;.  u8 *pFree
36a70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72   = 0;.  int szFr
36a80 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ee = 0;..  for(i
36a90 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
36aa0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
36ab0 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e  Cell = pCArray->
36ac0 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  apCell[i];.    i
36ad0 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74  f( pCell>=pStart
36ae0 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29   && pCell<pEnd )
36af0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  {.      int sz;.
36b00 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64        /* No need
36b10 20 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65   to use cachedCe
36b20 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20  llSize() here.  
36b30 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  The sizes of all
36b40 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20   cells that.    
36b50 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66    ** are to be f
36b60 72 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64  reed have alread
36b70 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67  y been computing
36b80 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20   while deciding 
36b90 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63  which.      ** c
36ba0 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e  ells need freein
36bb0 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20  g */.      sz = 
36bc0 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b  pCArray->szCell[
36bd0 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e  i];  assert( sz>
36be0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
36bf0 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73  Free!=(pCell + s
36c00 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z) ){.        if
36c10 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
36c20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
36c30 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
36c40 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
36c50 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  6 );.          f
36c60 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
36c70 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
36c80 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20  a), szFree);.   
36c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
36ca0 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
36cb0 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
36cc0 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  z;.        if( p
36cd0 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72  Free+sz>pEnd ) r
36ce0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
36cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
36d00 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
36d10 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73       szFree += s
36d20 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
36d30 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRet++;.    }. 
36d40 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29   }.  if( pFree )
36d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
36d60 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
36d70 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
36d80 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70  36 );.    freeSp
36d90 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
36da0 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
36db0 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zFree);.  }.  re
36dc0 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn nRet;.}../*
36dd0 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64  .** apCell[] and
36de0 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   szCell[] contai
36df0 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
36e00 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  nd sizes of all 
36e10 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cells in the.** 
36e20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
36e30 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65  nced.  The curre
36e40 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61  nt page, pPg, ha
36e50 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c  s pPg->nCell cel
36e60 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77  ls starting.** w
36e70 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d  ith apCell[iOld]
36e80 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69  .  After balanci
36e90 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68  ng, this page sh
36ea0 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63  ould hold nNew c
36eb0 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67  ells.** starting
36ec0 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d   at apCell[iNew]
36ed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36ee0 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e  tine makes the n
36ef0 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
36f00 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74  ents to pPg so t
36f10 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  hat it contains.
36f20 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ** the correct c
36f30 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67  ells after being
36f40 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a   balanced..**.**
36f50 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
36f60 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
36f70 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
36f80 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20  ion returns. It 
36f90 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e  is the.** respon
36fa0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
36fb0 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
36fc0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
36fd0 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 50 61  tatic int editPa
36fe0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
36ff0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37000 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
37010 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
37020 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20   iOld,          
37030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37040 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
37050 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e  ell currently on
37060 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
37070 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  New,            
37080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37090 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74  dex of new first
370a0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f   cell on page */
370b0 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20  .  int nNew,    
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
370e0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
370f0 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  age */.  CellArr
37100 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
37110 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37120 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64 20 73  y of cells and s
37130 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
37140 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
37150 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f  pPg->aData;.  co
37160 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
37170 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
37180 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50  u8 *pBegin = &pP
37190 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77  g->aCellIdx[nNew
371a0 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65   * 2];.  int nCe
371b0 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b  ll = pPg->nCell;
371c0 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
371d0 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f  stored on pPg */
371e0 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20  .  u8 *pData;.  
371f0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20  u8 *pCellptr;.  
37200 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c  int i;.  int iOl
37210 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50  dEnd = iOld + pP
37220 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e  g->nCell + pPg->
37230 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74  nOverflow;.  int
37240 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20   iNewEnd = iNew 
37250 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  + nNew;..#ifdef 
37260 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
37270 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
37280 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
37290 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
372a0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70  );.  memcpy(pTmp
372b0 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42  , aData, pPg->pB
372c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
372d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d  #endif..  /* Rem
372e0 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  ove cells from t
372f0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
37300 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
37310 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20    if( iOld<iNew 
37320 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66  ){.    int nShif
37330 74 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61  t = pageFreeArra
37340 79 28 70 50 67 2c 20 69 4f 6c 64 2c 20 69 4e 65  y(pPg, iOld, iNe
37350 77 2d 69 4f 6c 64 2c 20 70 43 41 72 72 61 79 29  w-iOld, pCArray)
37360 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50  ;.    memmove(pP
37370 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50  g->aCellIdx, &pP
37380 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69  g->aCellIdx[nShi
37390 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b  ft*2], nCell*2);
373a0 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53  .    nCell -= nS
373b0 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hift;.  }.  if( 
373c0 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e  iNewEnd < iOldEn
373d0 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  d ){.    nCell -
373e0 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
373f0 70 50 67 2c 20 69 4e 65 77 45 6e 64 2c 20 69 4f  pPg, iNewEnd, iO
37400 6c 64 45 6e 64 20 2d 20 69 4e 65 77 45 6e 64 2c  ldEnd - iNewEnd,
37410 20 70 43 41 72 72 61 79 29 3b 0a 20 20 7d 0a 0a   pCArray);.  }..
37420 20 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61    pData = &aData
37430 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f  [get2byteNotZero
37440 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d  (&aData[hdr+5])]
37450 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42  ;.  if( pData<pB
37460 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74  egin ) goto edit
37470 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  page_fail;..  /*
37480 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68   Add cells to th
37490 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
374a0 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65  age */.  if( iNe
374b0 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e  w<iOld ){.    in
374c0 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65  t nAdd = MIN(nNe
374d0 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20  w,iOld-iNew);.  
374e0 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d    assert( (iOld-
374f0 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43  iNew)<nNew || nC
37500 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50  ell==0 || CORRUP
37510 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c  T_DB );.    pCel
37520 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c  lptr = pPg->aCel
37530 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  lIdx;.    memmov
37540 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64  e(&pCellptr[nAdd
37550 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e  *2], pCellptr, n
37560 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28  Cell*2);.    if(
37570 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
37580 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c  (.          pPg,
37590 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
375a0 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
375b0 20 20 20 20 20 69 4e 65 77 2c 20 6e 41 64 64 2c       iNew, nAdd,
375c0 20 70 43 41 72 72 61 79 0a 20 20 20 20 29 20 29   pCArray.    ) )
375d0 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
375e0 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b  ail;.    nCell +
375f0 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f  = nAdd;.  }..  /
37600 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c  * Add any overfl
37610 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f  ow cells */.  fo
37620 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f  r(i=0; i<pPg->nO
37630 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20  verflow; i++){. 
37640 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28     int iCell = (
37650 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76  iOld + pPg->aiOv
37660 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20  fl[i]) - iNew;. 
37670 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20     if( iCell>=0 
37680 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b  && iCell<nNew ){
37690 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20  .      pCellptr 
376a0 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
376b0 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20  [iCell * 2];.   
376c0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c     memmove(&pCel
376d0 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74  lptr[2], pCellpt
376e0 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c  r, (nCell - iCel
376f0 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e  l) * 2);.      n
37700 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Cell++;.      if
37710 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
37720 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y(.            p
37730 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
37740 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
37750 20 20 20 20 20 20 20 20 20 20 69 43 65 6c 6c 2b            iCell+
37760 69 4e 65 77 2c 20 31 2c 20 70 43 41 72 72 61 79  iNew, 1, pCArray
37770 0a 20 20 20 20 20 20 29 20 29 20 67 6f 74 6f 20  .      ) ) goto 
37780 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20  editpage_fail;. 
37790 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
377a0 70 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20 74  ppend cells to t
377b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
377c0 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74 72  ge */.  pCellptr
377d0 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
377e0 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69 66  x[nCell*2];.  if
377f0 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
37800 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
37810 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
37820 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
37830 20 20 69 4e 65 77 2b 6e 43 65 6c 6c 2c 20 6e 4e    iNew+nCell, nN
37840 65 77 2d 6e 43 65 6c 6c 2c 20 70 43 41 72 72 61  ew-nCell, pCArra
37850 79 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69  y.  ) ) goto edi
37860 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70  tpage_fail;..  p
37870 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77  Pg->nCell = nNew
37880 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
37890 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
378a0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
378b0 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
378c0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
378d0 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
378e0 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65  - aData);..#ifde
378f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
37910 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b   && !CORRUPT_DB;
37920 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
37930 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e  Cell = pCArray->
37940 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a  apCell[i+iNew];.
37950 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67      int iOff = g
37960 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43  et2byte(&pPg->aC
37970 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20  ellIdx[i*2]);.  
37980 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61    if( pCell>=aDa
37990 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61  ta && pCell<&aDa
379a0 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  ta[pPg->pBt->usa
379b0 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  bleSize] ){.    
379c0 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
379d0 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
379e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
379f0 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c  ( 0==memcmp(pCel
37a00 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c  l, &aData[iOff],
37a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 41  .            pCA
37a20 72 72 61 79 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  rray->pRef->xCel
37a30 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2d 3e 70  lSize(pCArray->p
37a40 52 65 66 2c 20 70 43 41 72 72 61 79 2d 3e 61 70  Ref, pCArray->ap
37a50 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 29 20 29  Cell[i+iNew])) )
37a60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
37a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37a80 3b 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  ;. editpage_fail
37a90 3a 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  :.  /* Unable to
37aa0 20 65 64 69 74 20 74 68 69 73 20 70 61 67 65 2e   edit this page.
37ab0 20 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d   Rebuild it from
37ac0 20 73 63 72 61 74 63 68 20 69 6e 73 74 65 61 64   scratch instead
37ad0 2e 20 2a 2f 0a 20 20 70 6f 70 75 6c 61 74 65 43  . */.  populateC
37ae0 65 6c 6c 43 61 63 68 65 28 70 43 41 72 72 61 79  ellCache(pCArray
37af0 2c 20 69 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  , iNew, nNew);. 
37b00 20 72 65 74 75 72 6e 20 72 65 62 75 69 6c 64 50   return rebuildP
37b10 61 67 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26  age(pPg, nNew, &
37b20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37b30 69 4e 65 77 5d 2c 20 26 70 43 41 72 72 61 79 2d  iNew], &pCArray-
37b40 3e 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 29 3b 0a  >szCell[iNew]);.
37b50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
37b60 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
37b70 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
37b80 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
37b90 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
37ba0 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
37bb0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
37bc0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
37bd0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
37be0 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
37bf0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
37c00 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
37c10 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
37c20 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
37c30 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
37c40 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
37c50 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
37c60 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
37c70 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
37c80 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
37c90 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
37ca0 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
37cb0 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
37cc0 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
37cd0 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
37ce0 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
37cf0 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
37d00 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
37d10 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
37d20 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
37d30 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
37d40 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
37d50 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
37d60 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
37d70 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
37d80 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
37d90 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
37da0 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
37db0 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
37dc0 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
37dd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
37de0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
37df0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
37e00 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
37e10 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
37e20 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
37e30 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
37e40 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
37e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
37e60 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
37e70 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
37e80 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
37e90 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
37ea0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
37eb0 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
37ec0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
37ed0 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
37ee0 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
37ef0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
37f00 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
37f10 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
37f20 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
37f30 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
37f40 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
37f50 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
37f60 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65  g to balance the
37f70 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
37f80 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
37f90 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
37fa0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
37fb0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
37fc0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
37fd0 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
37fe0 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
37ff0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
38000 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
38010 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
38020 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
38030 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
38040 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
38050 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
38060 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
38070 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
38080 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
38090 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
380a0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
380b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
380c0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
380d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
380e0 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
380f0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
38100 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
38110 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
38120 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
38130 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
38140 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
38150 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
38160 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
38170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
38180 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
38190 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
381a0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
381b0 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
381c0 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
381d0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
381e0 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
381f0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
38200 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
38210 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
38220 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
38230 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
38240 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
38250 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
38260 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
38270 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
38280 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
38290 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
382a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
382b0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
382c0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
382d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
382e0 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
382f0 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
38300 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
38310 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
38320 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
38330 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
38340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38350 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
38360 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
38370 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
38380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38390 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
383a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
383b0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
383c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
383d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
383e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
383f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
38400 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
38410 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
38420 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
38430 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
38440 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
38450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
38460 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflo