/ Hex Artifact Content
Login

Artifact cf8310b4429e5f0400868b598d75d414b32da98e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
7e50: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
7e60: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
7e70: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
7e80: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7e90: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
7ea0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
7eb0: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
7ec0: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
7ed0: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
7ee0: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
7ef0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
7f00: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
7f10: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
7f20: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
7f30: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
7f40: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
7f50: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
7f60: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
7f70: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7f80: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7f90: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
7fa0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
7fb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7fc0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
7fd0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
7fe0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7ff0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8000: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8010: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8020: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8030: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8040: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
8050: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
8060: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
8070: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
8080: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
8090: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
80a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
80b0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
80c0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
80d0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
80e0: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
80f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8100: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8110: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8120: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
8130: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
8140: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
8150: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
8160: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8170: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8180: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8190: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
81a0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
81b0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
81c0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
81d0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
81e0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
81f0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
8200: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
8210: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
8220: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8230: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8240: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8250: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
8260: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
8270: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
8280: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
8290: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
82a0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
82b0: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
82c0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
82d0: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
82e0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
82f0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
8300: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
8310: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
8320: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8330: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8340: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8350: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8360: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
8370: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
8380: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
8390: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
83a0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
83b0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
83c0: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
83d0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 69  ;.  }.  pInfo->i
83e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
83f0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8400: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8410: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 70 49 6e   - pCell);.  pIn
8420: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
8430: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
8440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8450: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8460: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8470: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8480: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8490: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
84a0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
84b0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
84c0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
84d0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
84e0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
84f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8500: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8510: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8520: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8530: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8540: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8550: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8560: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8570: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8580: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8590: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
85a0: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
85b0: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
85c0: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
85d0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
85e0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
85f0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8600: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8610: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8620: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8640: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8650: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8660: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8670: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8680: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8690: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86b0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
86c0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
86d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
86e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
86f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8700: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
8710: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8720: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8730: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
8740: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
8750: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8760: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
8770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8780: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
8790: 65 3d 3d 34 20 29 3b 0a 20 20 70 49 6e 66 6f 2d  e==4 );.  pInfo-
87a0: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
87b0: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
87c0: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
87d0: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
87e0: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
87f0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8800: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  0;.  pInfo->iOve
8810: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e  rflow = 0;.  pIn
8820: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
8830: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
8840: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8850: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
8860: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8870: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8880: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8890: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
88a0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
88b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
88c0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
88d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
88e0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
88f0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8900: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
8910: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
8920: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
8930: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
8940: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
8950: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
8960: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8970: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
8980: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
8990: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
89a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
89b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
89c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
89d0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
89e0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
89f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
8a00: 61 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50  af || pPage->noP
8a10: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65  ayload );.  asse
8a20: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
8a30: 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73  load==0 );.  ass
8a40: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
8a50: 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  eyLeaf );.  asse
8a60: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8a70: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
8a80: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
8a90: 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
8aa0: 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  l, nPayload);.  
8ab0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8ac0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
8ad0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8ae0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
8af0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
8b00: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
8b10: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
8b20: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
8b30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8b40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
8b50: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
8b60: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
8b70: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
8b80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8b90: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8ba0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
8bb0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
8bc0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
8bd0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
8be0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
8bf0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
8c00: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8c10: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8c20: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
8c30: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8c40: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
8c50: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
8c60: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
8c70: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8c80: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
8c90: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
8ca0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
8cb0: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
8cc0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
8cd0: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
8ce0: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
8cf0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
8d00: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8d10: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
8d20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8d30: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8d40: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8d50: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d70: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8d80: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8d90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8da0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8db0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8dc0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8dd0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8de0: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8df0: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8e00: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8e10: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8e20: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8e30: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8e40: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
8e50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8e60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8e70: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8e80: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
8e90: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
8ea0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
8eb0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
8ec0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8ed0: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
8ee0: 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  d==0 );.  pIter 
8ef0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
8f00: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
8f10: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
8f20: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
8f30: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
8f40: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
8f50: 72 5b 39 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[9];.    nPaylo
8f60: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
8f70: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
8f80: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
8f90: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
8fa0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
8fb0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
8fc0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
8fd0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
8fe0: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
8ff0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9000: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
9010: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9020: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
9030: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
9040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9060: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9070: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9080: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
9090: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
90a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
90b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
90c0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
90d0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
90e0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
90f0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
9100: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
9110: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
9120: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
9130: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
9140: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
9150: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
9160: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
9170: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
9180: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
9190: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
91a0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
91b0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
91c0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
91d0: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
91e0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
91f0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
9200: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
9210: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9220: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
9230: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9240: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9250: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9260: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
9270: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
9280: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
9290: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
92a0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
92b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
92c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
92d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
92e0: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
92f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
9300: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
9310: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
9320: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9330: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9340: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9350: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9360: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
9370: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
9380: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
9390: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
93a0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
93b0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
93c0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
93d0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
93e0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
93f0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
9400: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
9410: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
9420: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
9430: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
9440: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
9450: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
9460: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
9470: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
9480: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
9490: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
94a0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
94b0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
94c0: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
94d0: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
94e0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
94f0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
9500: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
9510: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9520: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
9530: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9540: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
9550: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9560: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9570: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95a0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
95b0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
95c0: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
95f0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9600: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9610: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
9620: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
9630: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
9640: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
9650: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
9660: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
9670: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
9680: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
9690: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
96a0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
96b0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
96c0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
96d0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
96e0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
96f0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
9700: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
9710: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
9720: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
9730: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
9740: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9750: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
9760: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
9770: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
9780: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
9790: 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70   );.  nSize = *p
97a0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a  Iter;.  if( nSiz
97b0: 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70  e>=0x80 ){.    p
97c0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
97d0: 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78  .    nSize &= 0x
97e0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
97f0: 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65    nSize = (nSize
9800: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9810: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9820: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9830: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9840: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9850: 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  r++;.  if( pPage
9860: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
9870: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
9880: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
9890: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
98a0: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
98b0: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
98c0: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
98d0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
98e0: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
98f0: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
9900: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
9910: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
9920: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
9930: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
9940: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
9950: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
9960: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9970: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  }.  testcase( nS
9980: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
9990: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
99a0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
99b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
99c0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61    if( nSize<=pPa
99d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
99e0: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33      nSize += (u3
99f0: 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  2)(pIter - pCell
9a00: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
9a10: 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  <4 ) nSize = 4;.
9a20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
9a30: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9a40: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
9a50: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
9a60: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
9a70: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
9a80: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9a90: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
9aa0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9ab0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9ac0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
9ad0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
9ae0: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
9af0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
9b00: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
9b10: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
9b30: 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70  e += 4 + (u16)(p
9b40: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9b50: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69   }.  assert( nSi
9b60: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
9b70: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
9b80: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
9b90: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74  16)nSize;.}.stat
9ba0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
9bb0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50  trNoPayload(MemP
9bc0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9bd0: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
9be0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b  ter = pCell + 4;
9bf0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9c00: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9c10: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9c20: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9c30: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
9c40: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66  a varint */..#if
9c50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9c60: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
9c70: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
9c80: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
9c90: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
9ca0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
9cb0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
9cc0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
9cd0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
9ce0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
9cf0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
9d00: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
9d10: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
9d20: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
9d30: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
9d40: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
9d50: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
9d60: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
9d70: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
9d80: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
9d90: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
9da0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
9db0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
9dc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9dd0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9de0: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
9df0: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
9e00: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
9e10: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9e20: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
9e30: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
9e40: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9e50: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
9e60: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
9e70: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9e80: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
9e90: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
9ea0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
9eb0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
9ec0: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
9ed0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
9ee0: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
9ef0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
9f00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9f10: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
9f20: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
9f30: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
9f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9f50: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
9f60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
9f80: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
9f90: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
9fa0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
9fb0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
9fc0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
9fd0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
9fe0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
9ff0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
a000: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
a010: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
a020: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
a030: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
a040: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a050: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
a060: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
a070: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
a080: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
a090: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
a0a0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a0b0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
a0c0: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
a0d0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
a0e0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
a0f0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
a100: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
a110: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
a120: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
a130: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
a140: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
a150: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
a160: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
a170: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
a180: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
a190: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
a1a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
a1b0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
a1c0: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
a1d0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
a1e0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
a1f0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
a200: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
a210: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
a220: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
a230: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
a240: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
a250: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
a260: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
a270: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
a280: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
a290: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
a2a0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
a2b0: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
a2c0: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
a2d0: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
a2e0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
a2f0: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
a300: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
a310: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
a320: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
a330: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
a340: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
a350: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
a360: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
a370: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
a380: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a390: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a3a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
a3b0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
a3c0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a3d0: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
a3e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a410: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
a420: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
a450: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
a460: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
a470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
a480: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
a490: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
a4a0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
a4b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a4c0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a4d0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
a4e0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
a4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
a500: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
a510: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a520: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a540: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
a550: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
a560: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a570: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
a580: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
a590: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a5a0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
a5b0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
a5c0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
a5d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
a5e0: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
a5f0: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
a600: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
a610: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
a620: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
a630: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
a640: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
a650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a660: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
a670: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
a680: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a690: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a6a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a6c0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a6d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a6e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a6f0: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
a700: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
a710: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
a720: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
a730: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a740: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a750: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a760: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
a770: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
a780: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
a790: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a7a0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
a7b0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
a7c0: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
a7d0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
a7e0: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
a7f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a800: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
a810: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
a820: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
a830: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
a840: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
a850: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
a860: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
a870: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
a880: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
a890: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
a8a0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
a8b0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
a8c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
a8d0: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
a8e0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
a8f0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
a900: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
a910: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
a920: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
a930: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
a940: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
a950: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
a960: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
a970: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
a980: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
a990: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
a9a0: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
a9b0: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
a9c0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
a9d0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
a9e0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
a9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aa00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
aa10: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
aa20: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
aa30: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
aa40: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
aa50: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
aa60: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
aa70: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
aa80: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
aa90: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
aaa0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
aab0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aac0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
aad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
aae0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
aaf0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
ab00: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
ab10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
ab20: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
ab30: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
ab40: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
ab50: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
ab60: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
ab70: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
ab80: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
ab90: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
aba0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
abb0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
abc0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
abd0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
abe0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
abf0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
ac00: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
ac10: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
ac20: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
ac30: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
ac40: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
ac50: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
ac60: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
ac70: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
ac80: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
ac90: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
aca0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
acb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
acc0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
acd0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
ace0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
acf0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
ad00: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ad10: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
ad20: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
ad30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ad40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
ad50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
ad60: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
ad70: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
ad80: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
ad90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ada0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
adb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
adc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
add0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ade0: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
adf0: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ae00: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ae10: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ae20: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ae30: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ae40: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ae50: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
ae60: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
ae70: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
ae80: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
ae90: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
aea0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
aeb0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
aec0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
aed0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
aee0: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
aef0: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
af00: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
af10: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
af20: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
af30: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
af40: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
af50: 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20  ** If a slot of 
af60: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
af70: 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75  ytes is found bu
af80: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
af90: 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65   because .** the
afa0: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  re are already a
afb0: 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d  t least 60 fragm
afc0: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74  ented bytes on t
afd0: 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  he page, return 
afe0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  NULL..** In this
aff0: 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66 72   case, if pbDefr
b000: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
b010: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70  not NULL, set *p
b020: 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e  bDefrag to true.
b030: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
b040: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
b050: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
b060: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69  yte, int *pRc, i
b070: 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20  nt *pbDefrag){. 
b080: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
b090: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
b0a0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
b0b0: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
b0c0: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
b0d0: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
b0e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
b0f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b100: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
b110: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
b120: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
b130: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
b140: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
b150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b160: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
b170: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
b180: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
b190: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
b1a0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
b1b0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
b1c0: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
b1d0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
b1e0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
b1f0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
b200: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
b210: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
b220: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b230: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b240: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
b250: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
b260: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
b270: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
b280: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
b290: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
b2a0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b2b0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b2c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
b2d0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
b2e0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
b2f0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
b300: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
b310: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b320: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
b330: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
b340: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
b350: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
b360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
b370: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
b380: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
b390: 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67      if( pc < pPg
b3a0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
b3b0: 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a  Pg->nCell || siz
b3c0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
b3d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  e ){.        *pR
b3e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
b3f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
b400: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
b410: 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29   }else if( x<4 )
b420: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
b430: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
b440: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
b450: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
b460: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
b470: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
b480: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
b490: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
b4a0: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
b4b0: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
b4c0: 68 64 72 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20  hdr+7]>=60 ){.  
b4d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 44 65          if( pbDe
b4e0: 66 72 61 67 20 29 20 2a 70 62 44 65 66 72 61 67  frag ) *pbDefrag
b4f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
b500: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
b510: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 52    }.        /* R
b520: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
b530: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
b540: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
b550: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
b560: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
b570: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
b580: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
b590: 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41  memcpy(&aData[iA
b5a0: 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d  ddr], &aData[pc]
b5b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44  , 2);.        aD
b5c0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75  ata[hdr+7] += (u
b5d0: 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8)x;.      }else
b5e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b5f0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
b600: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
b610: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
b620: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
b630: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
b640: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
b650: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
b660: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
b670: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
b680: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
b690: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
b6a0: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
b6b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b6c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
b6d0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
b6e0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
b6f0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
b700: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
b710: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
b720: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
b730: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
b740: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
b750: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
b760: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b770: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
b780: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
b790: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
b7a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
b7b0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
b7c0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
b7d0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
b7e0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
b7f0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
b800: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
b810: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
b820: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
b830: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
b840: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
b850: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
b860: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
b870: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
b880: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
b890: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
b8a0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
b8b0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
b8c0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
b8d0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
b8e0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
b8f0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
b900: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
b910: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
b920: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
b930: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
b940: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
b950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b960: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
b970: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
b980: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
b990: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
b9a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9b0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
b9c0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
b9d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
b9e0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
b9f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
ba00: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
ba10: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ba20: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
ba30: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ba60: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
ba70: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
ba80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
baa0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
bab0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
bac0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
bad0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
bae0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
baf0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
bb00: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
bb10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bb20: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bb30: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bb40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bb50: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
bb60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bb70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bb80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bb90: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
bba0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
bbb0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
bbc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bbd0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
bbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bbf0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
bc00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
bc10: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
bc20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bc30: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
bc40: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
bc50: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
bc60: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bc70: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
bc80: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
bc90: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
bca0: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
bcb0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
bcc0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
bcd0: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
bce0: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
bcf0: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
bd00: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
bd10: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
bd20: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
bd30: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
bd40: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
bd50: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
bd60: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
bd70: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
bd80: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
bd90: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
bda0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
bdb0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
bdc0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
bdd0: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
bde0: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
bdf0: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
be00: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
be10: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
be20: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
be30: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
be40: 20 67 61 70 3e 74 6f 70 20 7c 7c 20 4e 45 56 45   gap>top || NEVE
be50: 52 28 28 75 33 32 29 74 6f 70 3e 70 50 61 67 65  R((u32)top>pPage
be60: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
be70: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  e) ){.    /* The
be80: 20 4e 45 56 45 52 28 29 20 69 73 20 62 65 63 61   NEVER() is beca
be90: 75 73 65 20 61 20 6f 76 65 72 73 69 7a 65 20 22  use a oversize "
bea0: 74 6f 70 22 20 76 61 6c 75 65 20 77 69 6c 6c 20  top" value will 
beb0: 62 65 20 62 6c 6f 63 6b 65 64 20 66 72 6f 6d 0a  be blocked from.
bec0: 20 20 20 20 2a 2a 20 72 65 61 63 68 69 6e 67 20      ** reaching 
bed0: 74 68 69 73 20 70 6f 69 6e 74 20 62 79 20 62 74  this point by bt
bee0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 6f 72  reeInitPage() or
bef0: 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
bf00: 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 72 65 74  age() */.    ret
bf10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bf20: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
bf30: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
bf40: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
bf50: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
bf60: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
bf70: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
bf80: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
bf90: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
bfa0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
bfb0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
bfc0: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
bfd0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
bfe0: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
bff0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
c000: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
c010: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
c020: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
c030: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
c040: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
c050: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
c060: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
c070: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
c080: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
c090: 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 65 66 72  ){.    int bDefr
c0a0: 61 67 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a  ag = 0;.    u8 *
c0b0: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
c0c0: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
c0d0: 74 65 2c 20 26 72 63 2c 20 26 62 44 65 66 72 61  te, &rc, &bDefra
c0e0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
c0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c100: 69 66 28 20 62 44 65 66 72 61 67 20 29 20 67 6f  if( bDefrag ) go
c110: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  to defragment_pa
c120: 67 65 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  ge;.    if( pSpa
c130: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
c140: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
c150: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
c160: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
c170: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
c180: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
c190: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c1a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
c1b0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
c1c0: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
c1d0: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
c1e0: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
c1f0: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
c200: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
c210: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
c220: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
c230: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
c240: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
c250: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
c260: 70 20 29 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74  p ){. defragment
c270: 5f 70 61 67 65 3a 0a 20 20 20 20 61 73 73 65 72  _page:.    asser
c280: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
c290: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
c2a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
c2b0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
c2c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c2d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
c2e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
c2f0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
c300: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
c310: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
c320: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
c330: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
c340: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
c350: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
c360: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
c370: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
c380: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
c390: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
c3a0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
c3b0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
c3c0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
c3d0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
c3e0: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
c3f0: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
c400: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
c420: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
c430: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
c440: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
c450: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
c460: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
c470: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
c480: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
c490: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c4a0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
c4b0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
c4c0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
c4d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
c4e0: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
c4f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c500: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c510: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
c520: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
c530: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
c540: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
c550: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
c560: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
c570: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
c580: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
c590: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
c5a0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
c5b0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
c5c0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
c5d0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
c5e0: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
c5f0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
c600: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
c610: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
c620: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
c630: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
c640: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
c650: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
c660: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
c670: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
c680: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
c690: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
c6a0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
c6b0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
c6c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c6d0: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
c6e0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
c6f0: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
c700: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
c710: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
c720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
c730: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
c740: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
c750: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
c760: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
c770: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
c780: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
c790: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
c7c0: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
c7d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
c7e0: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
c810: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
c820: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c850: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
c860: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
c870: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
c8a0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
c8b0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
c8c0: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c8e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
c8f0: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
c900: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
c910: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c920: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
c930: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
c940: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
c950: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
c960: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
c970: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
c980: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
c990: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
c9a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
c9b0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
c9c0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
c9d0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
c9e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
c9f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ca00: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ca10: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ca20: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
ca30: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
ca40: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
ca50: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
ca60: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
ca70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
ca80: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
ca90: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
caa0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
cab0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cac0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
cad0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
cae0: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
caf0: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
cb00: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
cb10: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
cb20: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
cb30: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
cb40: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
cb50: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
cb60: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
cb70: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
cb80: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
cb90: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
cba0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
cbb0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
cbc0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
cbd0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
cbe0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
cbf0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
cc00: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
cc10: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
cc20: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
cc30: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
cc40: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
cc50: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
cc60: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
cc70: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
cc80: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
cc90: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
cca0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
ccb0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
ccc0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
ccd0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
cce0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
ccf0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
cd00: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
cd10: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
cd20: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
cd30: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
cd40: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
cd50: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
cd60: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
cd70: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
cd80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
cd90: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
cda0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
cdb0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
cdc0: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
cdd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
cde0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
cdf0: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
ce00: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
ce10: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
ce20: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
ce30: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
ce40: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
ce50: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
ce60: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
ce70: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
ce80: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
ce90: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
cea0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
ceb0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
cec0: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
ced0: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
cee0: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
cef0: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
cf00: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
cf10: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
cf20: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
cf30: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
cf40: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
cf50: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
cf60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
cf70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cf80: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
cf90: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
cfa0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
cfb0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
cfc0: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
cfd0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
cfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
cff0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d000: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
d010: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
d020: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d030: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
d040: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
d050: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
d060: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
d070: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
d080: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
d090: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
d0a0: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
d0b0: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
d0c0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
d0d0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
d0e0: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
d0f0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d100: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
d110: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
d120: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
d130: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
d140: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d150: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
d160: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
d170: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
d180: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
d190: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d1a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d1b0: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
d1c0: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
d1d0: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
d1e0: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
d1f0: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d200: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
d210: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
d220: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
d230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d240: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d250: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
d260: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
d270: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
d280: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
d290: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
d2a0: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
d2b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
d2c0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
d2d0: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
d2e0: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
d2f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d300: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
d310: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
d320: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
d330: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
d340: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
d350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d360: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
d370: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
d380: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
d390: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
d3a0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
d3b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d3c0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
d3d0: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
d3e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
d3f0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
d400: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
d410: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
d420: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
d430: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
d440: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
d450: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
d460: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
d470: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
d480: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d490: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
d4a0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
d4b0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
d4c0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
d4d0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
d4e0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
d4f0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
d500: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
d510: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
d520: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
d530: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
d540: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
d550: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
d560: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
d570: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
d580: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
d590: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
d5a0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
d5b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
d5c0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
d5d0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
d5e0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
d5f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
d600: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
d610: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
d620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d630: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
d640: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
d650: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
d660: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
d670: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
d680: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
d690: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
d6a0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
d6b0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
d6c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
d6d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d6e0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
d6f0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
d700: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
d710: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
d720: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
d730: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
d740: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
d750: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
d760: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
d770: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
d780: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
d790: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
d7a0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
d7b0: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
d7c0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
d7d0: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
d7e0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
d7f0: 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35  F: R-03640-13415
d800: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65   A value of 5 me
d810: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
d820: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
d830: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
d840: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
d850: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
d860: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
d870: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
d880: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31  ENCE-OF: R-20501
d890: 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f  -61796 A value o
d8a0: 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70  f 13 means the p
d8b0: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
d8c0: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
d8d0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
d8e0: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
d8f0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
d900: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
d910: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
d920: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
d930: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
d940: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
d950: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
d960: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
d970: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ad = 0;.      pP
d980: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
d990: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
d9a0: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
d9b0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
d9c0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
d9d0: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
d9e0: 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  oad = 1;.      p
d9f0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
da00: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
da10: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
da20: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
da30: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
da40: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
da50: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
da60: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
da70: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
da80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
da90: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
daa0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
dab0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
dac0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
dad0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
dae0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
daf0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
db00: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
db10: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
db20: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
db30: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
db40: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
db50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
db60: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
db70: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
db80: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
db90: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
dba0: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
dbb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
dbc0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
dbd0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
dbe0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
dbf0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
dc00: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
dc10: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
dc20: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
dc30: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
dc40: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
dc50: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
dc60: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
dc70: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
dc80: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
dc90: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
dca0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
dcb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
dcc0: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
dcd0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
dce0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
dcf0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
dd00: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
dd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dd30: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
dd40: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
dd50: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
dd60: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
dd70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
dd80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
dd90: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
dda0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
ddb0: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
ddc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
ddd0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
dde0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
ddf0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
de00: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
de10: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
de20: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
de30: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
de40: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
de50: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
de60: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
de70: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
de80: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
de90: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
dea0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
deb0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
dec0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
ded0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
dee0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
def0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
df00: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
df10: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
df20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
df30: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
df40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
df50: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
df60: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
df70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
df80: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
df90: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
dfa0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
dfb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
dfc0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
dfd0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
dfe0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
dff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e000: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e010: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e020: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
e030: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
e040: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
e050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e060: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
e070: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
e080: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
e090: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
e0a0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
e0b0: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
e0c0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
e0d0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
e0e0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
e0f0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
e100: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
e110: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
e120: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
e130: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
e140: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
e150: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
e160: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
e170: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
e180: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
e190: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
e1a0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
e1b0: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
e1c0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
e1d0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
e1e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
e1f0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
e200: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
e210: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
e220: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
e230: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
e240: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
e250: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
e260: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
e270: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
e280: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
e290: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
e2a0: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
e2b0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
e2c0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
e2d0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
e2e0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
e2f0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
e300: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
e310: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e320: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
e330: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
e340: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
e350: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
e360: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
e370: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
e380: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
e390: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
e3a0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
e3b0: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
e3c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e3d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
e3e0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
e3f0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
e400: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
e410: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
e420: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
e430: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
e440: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
e450: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
e460: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
e470: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
e480: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
e490: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
e4a0: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
e4b0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
e4c0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
e4d0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
e4e0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
e4f0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
e500: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
e510: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e520: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
e530: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
e540: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
e550: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
e560: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
e570: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e580: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
e590: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
e5a0: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
e5b0: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
e5c0: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
e5d0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
e5e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
e5f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e600: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
e610: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
e620: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
e630: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
e640: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
e650: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
e660: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
e670: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
e680: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
e690: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
e6a0: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
e6b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
e6c0: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
e6d0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
e6e0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
e6f0: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
e700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e720: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
e730: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
e740: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
e750: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e760: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
e770: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
e780: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
e790: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
e7a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
e7b0: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
e7c0: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
e7d0: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
e7e0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
e7f0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
e800: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
e810: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
e820: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
e830: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
e840: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
e850: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e860: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
e870: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
e880: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
e890: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
e8a0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
e8b0: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
e8c0: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
e8d0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
e8e0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
e8f0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
e900: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
e910: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
e920: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
e930: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
e940: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
e950: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
e960: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
e970: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
e980: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
e990: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
e9a0: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
e9b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
e9c0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
e9d0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
e9e0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
e9f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
ea00: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
ea10: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
ea20: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
ea30: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
ea40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
ea50: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
ea60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
ea70: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
ea80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
ea90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
eaa0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
eab0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
eac0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
ead0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
eae0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
eaf0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
eb00: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
eb10: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
eb20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
eb30: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
eb40: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
eb50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
eb60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
eb70: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
eb80: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
eb90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
eba0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ebb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
ebc0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50  .        sz = pP
ebd0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
ebe0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
ebf0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
ec00: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
ec10: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
ec20: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
ec30: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
ec40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec50: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ec60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ec70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
ec80: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
ec90: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a  ast++;.    }  ..
eca0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
ecb0: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
ecc0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
ecd0: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
ece0: 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
ecf0: 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
ed00: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ed10: 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   1 gives the.   
ed20: 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
ed30: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
ed40: 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
ed50: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
ed60: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20  e are no.    ** 
ed70: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
ed80: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
ed90: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
eda0: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
edb0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20  [hdr+7] + top;  
edc0: 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f  /* Init nFree to
edd0: 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66   non-freeblock f
ede0: 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ree space */.   
edf0: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
ee00: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
ee10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
ee20: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
ee30: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
ee40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
ee50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30  ENCE-OF: R-55530
ee60: 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c  -52930 In a well
ee70: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
ee80: 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a  age, there will.
ee90: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
eea0: 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
eeb0: 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
eec0: 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
eed0: 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
eee0: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65        ** Or, the
eef0: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66   freeblock is of
ef00: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
ef10: 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f   page.        */
ef20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ef30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ef40: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
ef50: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
ef60: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
ef70: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
ef80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
ef90: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
efa0: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
efb0: 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
efc0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
efd0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
efe0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
eff0: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
f000: 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
f010: 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20  st byte of.     
f020: 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62     ** the free-b
f030: 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e  lock must lie on
f040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
f050: 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
f060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f070: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f080: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
f090: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
f0a0: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
f0b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f0c0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
f0d0: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
f0e0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
f0f0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
f100: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
f110: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
f120: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
f130: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
f140: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
f150: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
f160: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
f170: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
f180: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
f190: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
f1a0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
f1b0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
f1c0: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
f1d0: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
f1e0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
f1f0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
f200: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
f210: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
f220: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
f230: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
f240: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
f250: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
f260: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
f270: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f280: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f290: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
f2a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
f2b0: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
f2c0: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
f2d0: 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  st);.    pPage->
f2e0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
f2f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
f310: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
f320: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
f330: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
f340: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
f350: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
f360: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
f370: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f380: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
f390: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f3a0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
f3b0: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
f3c0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
f3d0: 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
f3e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
f3f0: 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
f400: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f410: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
f420: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
f430: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
f440: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f450: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
f460: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
f470: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
f480: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f490: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
f4a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f4b0: 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
f4c0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f4d0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
f4e0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f4f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f500: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
f510: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
f520: 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
f530: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
f540: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
f550: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
f560: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f570: 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
f580: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
f590: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
f5a0: 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26  = hdr + ((flags&
f5b0: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31  PTF_LEAF)==0 ? 1
f5c0: 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74  2 : 8);.  memset
f5d0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
f5e0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
f5f0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
f600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
f610: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
f620: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
f630: 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ee = (u16)(pBt->
f640: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
f650: 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  st);.  decodeFla
f660: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
f670: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
f680: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
f690: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
f6a0: 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
f6b0: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
f6c0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
f6d0: 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
f6e0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
f6f0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
f700: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
f710: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
f720: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
f730: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
f740: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
f750: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
f760: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
f770: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
f780: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
f790: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
f7a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
f7b0: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
f7c0: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
f7d0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
f7e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
f7f0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
f800: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
f810: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
f820: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
f830: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
f840: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
f850: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
f860: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
f870: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
f880: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
f890: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
f8a0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
f8b0: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
f8c0: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
f8d0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
f8e0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
f8f0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
f900: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f910: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
f920: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
f930: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
f940: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
f950: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
f960: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
f970: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
f980: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
f990: 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
f9a0: 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
f9b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
f9c0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
f9d0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
f9e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
f9f0: 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
fa00: 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
fa10: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
fa20: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
fa30: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
fa40: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
fa50: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
fa60: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
fa70: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
fa80: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
fa90: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
faa0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
fab0: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
fac0: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
fad0: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
fae0: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
faf0: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
fb00: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
fb10: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
fb20: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
fb30: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
fb40: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
fb50: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
fb60: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
fb70: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
fb80: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
fb90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
fba0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
fbb0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
fbc0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
fbd0: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
fbe0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
fbf0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
fc00: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
fc10: 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
fc20: 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
fc30: 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
fc40: 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
fc50: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
fc60: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
fc70: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
fc80: 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
fc90: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
fca0: 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
fcb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fcc0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
fcd0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
fce0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
fcf0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
fd00: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
fd10: 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
fd20: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
fd30: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
fd40: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
fd50: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
fd60: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
fd70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fd80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
fd90: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
fda0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
fdb0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
fdc0: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
fdd0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
fde0: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
fdf0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
fe00: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
fe10: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
fe20: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
fe30: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
fe40: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
fe50: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
fe60: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
fe70: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
fe80: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
fe90: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
fea0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
feb0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
fec0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
fed0: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
fee0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
fef0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
ff00: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
ff10: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
ff20: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
ff30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
ff40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ff50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
ff60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
ff70: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
ff80: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
ff90: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
ffa0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
ffb0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ffc0: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ffd0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ffe0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
fff0: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
10000 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
10010 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
10020 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
10030 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
10040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
10050 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
10060 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
10070 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10080 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
10090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
100a0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
100b0 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
100c0 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
100d0 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a  tine is just a.*
100e0 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  * convenience wr
100f0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
10100 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62  arate calls to b
10110 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
10120 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  d .** btreeInitP
10130 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10140 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10150 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
10160 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
10170 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  o is undefined. 
10180 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
10190 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
101a0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
101b0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
101c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
101d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
101e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
10210 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
10220 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10240 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
10250 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
10260 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10280 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
10290 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
102a0 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20    int bReadonly 
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52    /* PAGER_GET_R
102d0 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a  EADONLY or 0 */.
102e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
102f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10300 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10310 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10320 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41  t( bReadonly==PA
10330 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
10340 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30   || bReadonly==0
10350 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
10360 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
10370 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
10380 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10390 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
103a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
103b0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
103c0 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79  pPage, bReadonly
103d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
103e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
103f0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
10400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
10410 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
10420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
10430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10440 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
10450 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
10460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10470 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
10480 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
10490 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
104a0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
104b0 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
104c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
104d0 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
104e0 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
104f0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
10500 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
10510 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
10520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10530 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
10540 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
10550 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10570 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
10580 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
10590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
105a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
105b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
105c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
105d0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
105e0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
105f0 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
10600 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10610 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
10620 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
10630 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
10640 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10650 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
10660 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10670 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
10680 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
10690 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
106a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
106b0 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
106c0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
106d0 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
106e0 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
106f0 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
10700 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
10710 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
10720 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
10730 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
10740 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
10750 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
10760 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
10770 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
10780 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
10790 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
107a0 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
107b0 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
107c0 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
107d0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
107e0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
107f0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10810 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10820 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10830 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10840 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10850 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
10860 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
10870 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
10880 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
10890 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
108a0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
108b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
108c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
108d0 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
108e0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
108f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10900 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10910 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
10920 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
10930 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
10940 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
10950 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
10960 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
10970 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10980 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
10990 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
109a0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
109b0 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
109c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
109d0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
109e0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
109f0 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
10a00 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
10a10 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
10a20 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
10a30 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
10a40 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
10a50 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
10a60 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
10a70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
10a80 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
10a90 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
10aa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
10ab0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10ac0 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
10ad0 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
10ae0 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
10af0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
10b00 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
10b10 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
10b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10b30 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
10b40 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
10b50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
10b60 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
10b70 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
10b80 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
10b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10ba0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
10bb0 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
10bc0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
10bd0 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
10be0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10bf0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
10c00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
10c10 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
10c20 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10c30 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
10c40 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
10c50 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
10c60 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
10c70 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
10c80 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
10c90 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
10ca0 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
10cb0 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
10cc0 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
10cd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
10ce0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
10cf0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
10d00 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
10d10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10d20 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
10d30 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
10d40 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
10d50 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
10d60 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
10d70 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
10d80 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
10d90 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
10da0 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
10db0 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
10dc0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
10dd0 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
10de0 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
10df0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
10e00 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
10e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
10e20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
10e30 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
10e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10e50 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
10e60 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
10e70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10e80 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
10e90 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
10ea0 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
10eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10ec0 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
10ed0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
10ee0 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
10ef0 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
10f00 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
10f10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
10f20 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
10f30 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
10f40 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
10f50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10f60 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
10f70 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
10f80 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
10f90 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
10fa0 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
10fb0 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
10fc0 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
10fd0 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
10fe0 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
10ff0 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
11000 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
11010 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
11020 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11030 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
11040 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
11050 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
11060 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
11070 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
11080 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
11090 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
110a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
110b0 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
110c0 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
110d0 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
110e0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
110f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
11100 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
11110 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
11120 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
11130 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
11140 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
11150 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
11160 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
11170 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
11180 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
11190 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
111a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
111b0 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
111c0 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
111d0 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
111e0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
111f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
11200 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
11210 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
11220 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
11230 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
11240 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
11250 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
11260 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
11270 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
11280 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
11290 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
112a0 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
112b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
112c0 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
112d0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
112e0 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
112f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
11300 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11310 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
11320 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
11330 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
11340 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11350 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
11360 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
11370 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
11380 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
11390 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
113a0 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
113b0 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
113c0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
113d0 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
113e0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
113f0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11400 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
11410 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
11420 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
11430 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11440 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
11450 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
11460 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
11470 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
11480 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
11490 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
114a0 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
114b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
114c0 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
114d0 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
114e0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
114f0 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
11500 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11510 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
11520 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11530 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
11540 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
11550 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
11560 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
11570 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
11580 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
11590 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
115a0 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
115b0 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
115c0 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
115d0 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
115e0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
115f0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
11600 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
11610 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
11620 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
11630 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
11640 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
11650 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
11660 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
11670 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
11680 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
11690 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
116a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
116b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
116c0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
116d0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
116e0 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
116f0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
11700 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
11710 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
11720 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
11730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11740 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
11750 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
11760 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
11770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11780 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
11790 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
117a0 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
117b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
117c0 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
117d0 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
117e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
117f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
11800 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11810 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
11820 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
11830 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
11840 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
11850 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
11860 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
11870 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
11880 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
11890 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
118a0 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
118b0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
118c0 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
118d0 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
118e0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
118f0 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
11900 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
11910 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
11920 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
11930 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
11940 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
11950 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
11960 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
11970 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
11980 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
11990 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
119a0 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
119b0 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
119c0 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
119d0 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
119e0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
119f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
11a00 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
11a10 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
11a20 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
11a30 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
11a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11a50 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
11a60 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
11a70 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
11a80 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
11a90 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
11aa0 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
11ab0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
11ac0 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
11ad0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
11ae0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11af0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
11b00 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
11b10 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
11b20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
11b30 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
11b40 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
11b50 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
11b60 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
11b70 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
11b80 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
11b90 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
11ba0 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
11bb0 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
11bc0 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
11bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
11be0 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
11bf0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
11c00 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
11c10 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
11c20 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
11c30 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
11c40 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69  name)+1;.      i
11c50 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
11c60 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
11c70 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
11c80 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
11c90 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
11ca0 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61  (MAX(nFullPathna
11cb0 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  me,nFilename));.
11cc0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
11cd0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
11ce0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
11cf0 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ..      p->shara
11d00 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ble = 1;.      i
11d10 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
11d20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
11d30 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
11d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11d50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11d60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
11d70 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
11d80 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
11d90 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
11da0 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
11db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11dd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
11de0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
11e20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
11e30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
11e40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11e50 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
11e60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
11e70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11e80 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
11e90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11ea0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
11eb0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
11ec0 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
11ed0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
11ee0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
11ef0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
11f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
11f10 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
11f20 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
11f30 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
11f40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
11f50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
11f60 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
11f70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11f80 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
11f90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
11fa0 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
11fb0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11fc0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
11fd0 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
11fe0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
11ff0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
12000 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
12010 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
12020 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
12030 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
12040 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
12070 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
12080 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
12090 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
120a0 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
120b0 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
120c0 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
120d0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
120e0 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
120f0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
12100 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
12110 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
12120 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12140 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12150 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12170 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12180 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12190 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
121a0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
121b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
121c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
121d0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
121e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
121f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
12200 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12220 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
12230 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
12240 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
12250 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12260 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12270 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12280 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
12290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
122a0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
122b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
122c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
122d0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
122e0 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
122f0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
12300 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
12310 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
12320 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
12330 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
12340 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
12350 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
12360 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
12370 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
12380 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
12390 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
123a0 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
123b0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
123c0 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
123d0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
123e0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
123f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
12400 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
12410 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
12420 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
12430 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
12440 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
12450 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
12460 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
12470 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
12480 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
12490 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
124a0 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
124b0 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
124c0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
124d0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
124e0 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
124f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12500 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
12510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
12520 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
12530 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
12540 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
12550 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
12560 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
12570 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12580 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
12590 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
125a0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
125b0 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
125c0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
125d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
125e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
125f0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
12600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12610 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
12620 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
12630 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
12640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12650 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
12660 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
12670 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
12680 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
126a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
126b0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
126c0 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
126d0 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
126e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
126f0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
12700 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
12710 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
12720 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
12730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
12750 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
12760 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
12770 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
12780 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
12790 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
127a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
127b0 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
127c0 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
127d0 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
127e0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
127f0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
12800 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
12810 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12820 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12830 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
12840 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
12850 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
12860 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
12870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
12880 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
12890 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
128a0 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
128b0 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
128c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
128d0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
128e0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
128f0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
12900 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
12910 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
12920 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
12930 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
12940 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
12950 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
12960 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
12970 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
12980 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
12990 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
129a0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
129b0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
129c0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
129d0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
129e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
129f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
12a00 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
12a10 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
12a20 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
12a30 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
12a40 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
12a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12a60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
12a70 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
12a80 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
12a90 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
12aa0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12ab0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
12ac0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
12ad0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
12ae0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
12af0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
12b00 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
12b10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
12b20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
12b30 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
12b40 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
12b50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
12b60 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
12b70 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
12b80 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
12b90 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
12ba0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
12bb0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
12bc0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
12bd0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
12be0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
12bf0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
12c00 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
12c10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
12c20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
12c30 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
12c40 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
12c50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
12c60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
12c70 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
12c80 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
12c90 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
12ca0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
12cb0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
12cc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
12cd0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
12ce0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
12cf0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
12d00 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
12d10 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
12d20 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
12d30 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
12d40 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
12d50 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
12d60 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
12d70 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
12d80 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
12d90 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
12da0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
12db0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
12dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12dd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12de0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
12df0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
12e00 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
12e10 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
12e20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
12e30 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
12e40 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
12e50 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
12e60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
12e70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
12e80 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
12e90 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
12ea0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
12eb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
12ec0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
12ed0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
12ee0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
12ef0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
12f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
12f10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
12f20 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
12f30 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
12f40 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
12f50 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
12f60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12f70 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
12f80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
12f90 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
12fa0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
12fb0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
12fc0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
12fd0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
12fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12ff0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
13000 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
13010 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
13020 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
13030 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
13040 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
13050 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
13060 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
13070 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13080 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
13090 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
130a0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
130b0 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
130c0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
130d0 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
130e0 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
130f0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
13100 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
13110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
13120 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
13130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
13140 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13150 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
13160 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
13170 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
13180 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
13190 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
131a0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
131b0 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
131c0 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
131d0 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
131e0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
131f0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
13200 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
13210 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
13220 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
13230 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
13240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13250 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13260 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
13270 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
13280 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13290 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
132a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
132b0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
132c0 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
132d0 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
132e0 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
132f0 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
13300 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
13310 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
13320 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
13330 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
13340 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
13350 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
13360 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
13370 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
13380 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
13390 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
133a0 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
133b0 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
133c0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
133d0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
133e0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
133f0 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
13400 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
13410 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
13420 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
13430 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
13440 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
13450 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
13460 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
13470 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
13480 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
13490 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
134a0 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
134b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
134c0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
134d0 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
134e0 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
134f0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
13500 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
13510 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
13520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
13530 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
13540 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
13550 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
13560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13570 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
13580 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
13590 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
135a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
135b0 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
135c0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
135d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
135e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
135f0 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
13600 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
13610 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
13620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13630 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
13640 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
13650 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
13660 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
13670 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13680 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
13690 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
136a0 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
136b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
136c0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
136d0 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
136e0 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
136f0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
13700 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
13710 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
13720 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
13730 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
13740 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
13750 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
13760 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
13770 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
13780 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
13790 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
137a0 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
137b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
137c0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
137d0 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
137e0 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
137f0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
13800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13810 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
13820 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13830 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
13840 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
13850 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13860 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
13870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13880 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
13890 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
138a0 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
138b0 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
138c0 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
138d0 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
138e0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
138f0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
13900 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
13910 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
13920 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
13930 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
13940 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
13950 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
13960 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
13970 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
13980 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
13990 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
139a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
139b0 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
139c0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
139d0 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
139e0 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
139f0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
13a00 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
13a10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13a20 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
13a30 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
13a40 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
13a50 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
13a60 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13a70 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
13a80 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
13a90 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
13aa0 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
13ab0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
13ac0 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
13ad0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13ae0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13af0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
13b00 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
13b10 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
13b20 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
13b30 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
13b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
13b50 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
13b60 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
13b70 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
13b80 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
13b90 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
13ba0 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
13bb0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
13bc0 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
13bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13be0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
13bf0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
13c00 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
13c10 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
13c20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
13c30 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
13c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13c50 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
13c60 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
13c70 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
13c80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13c90 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
13ca0 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
13cb0 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
13cc0 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
13cd0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
13ce0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
13cf0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
13d00 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
13d10 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
13d20 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
13d30 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
13d40 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
13d50 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
13d60 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
13d70 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
13d80 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
13d90 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
13da0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
13db0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
13dc0 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
13dd0 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
13de0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
13df0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
13e00 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
13e10 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
13e20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
13e30 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
13e40 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
13e50 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
13e60 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
13e70 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
13e80 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
13e90 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
13ea0 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
13eb0 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
13ec0 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
13ed0 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
13ee0 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
13ef0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
13f00 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
13f10 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
13f20 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
13f30 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
13f40 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
13f50 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
13f60 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
13f70 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
13f80 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
13f90 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
13fa0 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
13fb0 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
13fc0 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
13fd0 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
13fe0 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
13ff0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
14000 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
14010 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
14020 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
14030 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
14040 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
14050 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
14060 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
14070 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
14080 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
14090 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
140a0 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
140b0 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
140c0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
140d0 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
140e0 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
140f0 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
14100 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
14110 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
14120 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
14130 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
14140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
14150 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
14160 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
14170 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
14180 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
14190 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
141a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
141b0 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
141c0 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
141d0 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
141e0 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
141f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14200 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
14210 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
14220 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
14230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14240 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
14250 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
14260 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
14270 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
14280 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
14290 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
142a0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
142b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
142c0 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
142d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
142e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
142f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
14300 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
14310 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
14320 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
14330 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
14340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14350 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
14360 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14370 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
14380 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
14390 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
143a0 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
143b0 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
143c0 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
143d0 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
143e0 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
143f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14400 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
14410 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
14420 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
14430 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
14440 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
14450 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
14460 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
14470 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
14480 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
14490 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
144a0 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
144b0 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
144c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
144d0 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
144e0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
144f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14500 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
14510 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
14520 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
14530 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
14540 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
14550 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
14560 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
14570 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
14580 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
14590 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
145a0 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
145b0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
145c0 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
145d0 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
145e0 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
145f0 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
14600 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
14610 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
14620 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
14630 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
14640 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
14650 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
14660 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
14670 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
14680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
14690 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
146a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
146b0 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
146c0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
146d0 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
146e0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
146f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14700 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
14710 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
14720 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
14730 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
14740 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
14750 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14760 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
14770 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
14780 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
14790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
147a0 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
147b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
147c0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
147d0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
147e0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
147f0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
14800 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
14810 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
14820 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
14830 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
14840 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
14850 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
14860 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
14870 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
14880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14890 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
148a0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
148b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
148c0 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
148d0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
148e0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
148f0 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
14900 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
14910 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
14920 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
14930 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
14940 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
14950 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
14960 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
14970 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
14980 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
14990 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
149a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
149b0 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
149c0 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
149d0 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
149e0 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
149f0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
14a00 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
14a10 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
14a20 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
14a30 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
14a40 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
14a50 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
14a60 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
14a70 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
14a80 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
14a90 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
14aa0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
14ab0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
14ac0 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
14ad0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
14ae0 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
14af0 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
14b00 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
14b10 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
14b20 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
14b30 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
14b40 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
14b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
14b60 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
14b70 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
14b80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14b90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
14ba0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14bb0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
14bc0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
14bd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14be0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
14bf0 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
14c00 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
14c10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14c20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14c40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
14c50 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
14c60 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
14c70 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
14c80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14c90 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
14ca0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
14cb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14cc0 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
14cd0 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
14ce0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
14cf0 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
14d00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14d10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14d20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
14d30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
14d40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14d50 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
14d60 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
14d70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
14d80 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
14d90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14db0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
14dc0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
14dd0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
14de0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
14df0 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
14e00 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
14e10 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
14e20 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
14e30 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
14e40 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
14e50 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
14e60 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
14e70 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
14e80 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
14e90 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
14ea0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
14eb0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
14ec0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
14ed0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
14ee0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
14ef0 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
14f00 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
14f10 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
14f20 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
14f30 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
14f40 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
14f50 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
14f60 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
14f70 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
14f80 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
14f90 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
14fa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
14fb0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
14fc0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
14fd0 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
14fe0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14ff0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
15000 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
15010 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
15020 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
15030 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
15040 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
15050 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
15060 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15080 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15090 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
150a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
150b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
150c0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
150d0 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
150e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
150f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15110 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15120 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
15130 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
15140 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
15150 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
15160 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
15170 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
15180 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
15190 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
151a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
151b0 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
151c0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
151d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
151e0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
151f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15200 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15210 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
15220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15230 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
15240 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
15250 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
15260 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
15270 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
15280 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15290 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
152a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
152b0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
152c0 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
152d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
152e0 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
152f0 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
15300 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
15310 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
15320 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
15330 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
15340 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
15350 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
15360 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
15370 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
15380 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
15390 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
153a0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
153b0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
153c0 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
153d0 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
153e0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
153f0 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
15400 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
15410 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
15420 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
15430 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
15440 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
15450 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
15460 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
15470 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
15480 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
15490 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
154a0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
154b0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
154c0 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
154d0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
154e0 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
154f0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
15500 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
15510 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
15520 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15530 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
15540 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
15550 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
15560 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
15570 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
15580 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
15590 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
155a0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
155b0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
155c0 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
155d0 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
155e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
155f0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
15600 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
15610 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
15620 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
15630 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15640 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
15650 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15660 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
15670 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
15680 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
15690 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
156a0 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
156b0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
156c0 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
156d0 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
156e0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
156f0 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
15700 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
15710 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15720 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15730 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
15740 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15750 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15760 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
15770 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
15780 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
15790 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
157a0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
157b0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
157c0 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
157d0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
157e0 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
157f0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
15800 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
15810 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
15820 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
15830 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
15840 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
15850 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
15860 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
15870 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
15880 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
15890 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
158a0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
158b0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
158c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
158d0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
158e0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
158f0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15900 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
15910 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
15920 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
15930 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
15940 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
15950 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
15960 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
15970 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15990 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
159a0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
159b0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
159c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
159d0 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
159e0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
159f0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
15a00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
15a10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
15a20 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
15a30 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
15a40 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
15a50 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
15a60 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
15a70 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
15a80 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
15a90 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
15aa0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
15ab0 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
15ac0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
15ad0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
15ae0 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
15af0 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
15b00 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
15b10 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
15b20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
15b30 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15b40 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
15b50 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
15b60 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
15b70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15b80 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
15b90 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
15ba0 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
15bb0 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
15bc0 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
15bd0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
15be0 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
15bf0 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
15c00 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
15c10 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
15c20 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
15c30 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
15c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15c50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15c60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15c70 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
15c80 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
15c90 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
15ca0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
15cb0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
15cc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
15cd0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
15ce0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
15cf0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
15d00 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
15d10 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
15d20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
15d30 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
15d40 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
15d50 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
15d60 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
15d70 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
15d80 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
15d90 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
15da0 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
15db0 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
15dc0 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
15dd0 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
15de0 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
15df0 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
15e00 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
15e10 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
15e20 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
15e30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15e40 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
15e50 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
15e60 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
15e70 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15e80 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
15e90 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
15ea0 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
15eb0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
15ec0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
15ed0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15ee0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
15ef0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
15f00 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
15f10 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
15f20 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
15f30 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
15f40 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
15f50 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
15f60 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
15f70 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
15f80 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
15f90 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
15fa0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
15fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15fc0 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
15fd0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
15fe0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
15ff0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16000 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16010 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
16020 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
16030 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16040 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16050 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16060 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
16070 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
16080 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
16090 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
160a0 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
160b0 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
160c0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
160d0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
160e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
160f0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
16100 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
16110 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
16120 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16130 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
16140 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
16150 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
16160 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
16170 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
16180 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
16190 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
161a0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
161b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
161c0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
161d0 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
161e0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
161f0 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
16200 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
16210 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
16220 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
16230 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
16240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
16260 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16270 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
16280 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
16290 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
162a0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
162b0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
162c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
162d0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
162e0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
162f0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
16300 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
16310 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
16320 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
16330 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
16340 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
16350 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
16360 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
16370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16380 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
16390 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
163a0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
163b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
163d0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
163e0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
163f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16400 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
16410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
16420 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
16430 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
16440 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16450 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
16460 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
16470 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
16480 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
16490 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
164a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
164b0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
164c0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
164d0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
164e0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
164f0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
16500 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
16510 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16520 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
16530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16540 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
16550 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
16560 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
16570 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
16580 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
16590 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
165a0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
165b0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
165c0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
165d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
165e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
165f0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
16600 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
16610 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
16620 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16630 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
16640 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
16650 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
16660 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
16670 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
16680 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
16690 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
166a0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
166b0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
166c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
166d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
166e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
166f0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
16700 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
16710 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16720 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
16730 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
16740 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
16750 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
16760 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16770 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
16780 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
16790 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
167a0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
167b0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
167c0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
167d0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
167e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
167f0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
16800 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
16810 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
16820 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
16830 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
16840 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
16850 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
16860 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
16870 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16880 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
16890 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
168a0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
168b0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
168c0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
168d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
168e0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
168f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16900 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
16910 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
16920 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
16930 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
16940 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
16950 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
16960 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
16970 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
16980 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16990 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
169a0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
169b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
169c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
169d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
169e0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
169f0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
16a00 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
16a10 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
16a20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16a30 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16a40 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
16a50 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
16a60 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
16a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16a80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
16a90 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
16aa0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
16ab0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
16ac0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
16ad0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
16ae0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
16af0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
16b00 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
16b10 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
16b20 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
16b30 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
16b40 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
16b50 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
16b60 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
16b70 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
16b80 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
16b90 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
16ba0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
16bb0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
16bc0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
16bd0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
16be0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
16bf0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
16c00 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
16c10 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
16c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
16c30 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
16c40 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
16c50 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
16c60 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
16c70 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
16c80 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
16c90 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
16ca0 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
16cb0 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
16cc0 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
16cd0 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
16ce0 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
16cf0 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
16d00 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
16d10 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
16d20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
16d30 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
16d40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
16d50 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
16d60 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
16d70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16d80 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
16d90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
16da0 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
16db0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16dc0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
16dd0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
16de0 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
16df0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
16e00 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
16e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16e20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
16e30 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
16e40 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
16e50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
16e60 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
16e70 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
16e80 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
16e90 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
16ea0 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
16eb0 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
16ec0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
16ed0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
16ee0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
16ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
16f00 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
16f10 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
16f20 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
16f30 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
16f40 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
16f50 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
16f60 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
16f70 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
16f80 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
16f90 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
16fa0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
16fb0 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
16fc0 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
16fd0 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
16fe0 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
16ff0 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
17000 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
17010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17020 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
17030 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
17040 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
17050 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
17060 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
17070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17080 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
17090 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
170a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
170b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
170c0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
170d0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
170e0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
170f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
17100 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
17110 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
17120 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17130 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
17140 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17150 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17160 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17170 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
17180 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
17190 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
171a0 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
171b0 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
171c0 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
171d0 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
171e0 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
171f0 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
17200 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
17210 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
17220 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
17230 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
17240 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
17250 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
17260 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
17270 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
17280 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
17290 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
172a0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
172b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
172c0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
172d0 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
172e0 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
172f0 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
17300 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
17310 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
17320 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
17330 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
17340 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
17350 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
17360 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
17370 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
17380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17390 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
173a0 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
173b0 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
173c0 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
173d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
173e0 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
173f0 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
17400 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
17410 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
17420 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
17430 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
17440 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
17450 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
17460 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
17470 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
17480 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
17490 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
174a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
174b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
174c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
174d0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
174e0 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
174f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
17500 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
17510 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
17520 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
17530 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
17540 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
17550 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17560 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
17570 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
17580 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
17590 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
175a0 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
175b0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
175c0 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
175d0 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
175e0 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
175f0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
17600 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
17610 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
17620 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
17630 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
17640 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
17650 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
17660 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
17670 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
17680 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
17690 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
176a0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
176b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
176c0 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
176d0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
176e0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
176f0 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
17700 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
17710 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
17720 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
17730 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
17740 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
17750 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
17760 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
17770 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
17780 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
17790 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
177a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
177b0 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
177c0 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
177d0 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
177e0 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
177f0 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
17800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17810 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
17820 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
17830 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
17840 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
17850 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
17860 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
17870 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
17880 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
17890 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
178a0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
178b0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
178c0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
178f0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
17900 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17910 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
17920 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
17930 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
17940 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
17950 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
17960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
17970 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17980 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17990 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
179a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
179b0 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
179c0 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
179d0 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
179e0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
179f0 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
17a00 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
17a10 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
17a20 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
17a30 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
17a40 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
17a50 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
17a60 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
17a70 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
17a80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17a90 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17aa0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
17ab0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
17ac0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
17ad0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
17ae0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
17af0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17b00 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
17b10 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
17b20 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
17b30 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
17b40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17b50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
17b60 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
17b70 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
17b80 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
17b90 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
17ba0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
17bb0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
17bc0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
17bd0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
17be0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
17bf0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
17c00 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
17c10 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
17c20 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
17c30 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
17c40 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
17c50 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
17c60 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
17c70 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
17c80 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
17c90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17ca0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
17cb0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
17cc0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
17cd0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
17ce0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
17cf0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
17d00 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
17d10 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
17d20 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
17d30 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
17d40 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
17d50 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
17d60 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
17d70 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
17d80 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
17d90 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
17da0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
17db0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
17dc0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
17dd0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
17de0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
17df0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
17e00 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
17e10 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
17e20 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
17e30 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
17e40 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
17e50 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
17e60 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
17e70 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
17e80 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
17e90 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
17ea0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
17eb0 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
17ec0 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
17ed0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
17ee0 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
17ef0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
17f00 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
17f10 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
17f20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
17f30 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
17f40 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
17f50 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
17f60 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
17f70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
17f80 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
17f90 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
17fa0 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
17fb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
17fc0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
17fd0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
17fe0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
17ff0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
18000 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18010 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
18020 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
18030 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
18040 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
18050 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
18060 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
18070 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
18080 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
18090 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
180a0 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
180b0 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
180c0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
180d0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
180e0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
180f0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
18100 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
18110 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
18120 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
18130 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
18140 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
18150 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
18160 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
18170 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
18180 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
18190 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
181a0 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
181b0 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
181c0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
181d0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
181e0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
181f0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
18200 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
18210 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
18220 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
18230 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
18240 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18250 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
18260 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
18270 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
18280 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
18290 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
182a0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
182b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
182c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
182d0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
182e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
182f0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
18300 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
18310 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
18320 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
18330 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
18340 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
18350 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
18360 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
18370 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
18380 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18390 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
183a0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
183b0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
183c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
183d0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
183e0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
183f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18400 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
18410 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
18420 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
18430 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
18440 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18450 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18460 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
18470 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
18480 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
18490 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
184a0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
184b0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
184c0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
184d0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
184e0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
184f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
18500 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
18510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18520 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
18530 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18540 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
18550 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
18560 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
18570 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
18580 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
18590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
185a0 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
185b0 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
185c0 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
185d0 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
185e0 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
185f0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
18600 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
18610 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
18620 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
18630 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
18640 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
18650 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
18660 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
18670 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
18680 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
18690 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
186a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
186b0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
186c0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
186d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
186e0 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
186f0 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
18700 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
18710 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
18720 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18730 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
18740 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
18750 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
18760 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
18770 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
18780 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
18790 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
187a0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
187b0 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
187c0 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
187d0 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
187e0 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
187f0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
18800 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
18810 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
18820 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
18830 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
18840 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
18850 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
18860 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
18870 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
18880 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
18890 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
188a0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
188b0 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
188c0 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
188d0 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
188e0 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
188f0 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
18900 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
18910 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
18920 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
18930 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
18940 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18950 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18960 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18970 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18980 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18990 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
189a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
189b0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
189c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
189d0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
189e0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
189f0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
18a00 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
18a10 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
18a20 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
18a30 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
18a40 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
18a50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
18a60 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
18a70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18a80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
18a90 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
18aa0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
18ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
18ac0 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
18ad0 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
18ae0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
18af0 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
18b00 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
18b10 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
18b20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
18b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
18b40 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
18b50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18b60 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
18b70 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
18b80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18b90 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
18ba0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
18bb0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
18bc0 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
18bd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18bf0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
18c00 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
18c10 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
18c20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
18c30 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
18c40 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
18c50 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
18c60 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
18c70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
18c80 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
18c90 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
18ca0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
18cb0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
18cc0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
18cd0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
18ce0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
18cf0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
18d00 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
18d10 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
18d20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
18d30 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
18d40 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
18d50 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
18d60 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
18d70 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
18d80 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
18d90 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
18da0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
18db0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
18dc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
18dd0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
18de0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
18df0 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
18e00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
18e10 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
18e20 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
18e30 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
18e40 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
18e50 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
18e60 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
18e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
18e80 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
18e90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
18ea0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
18eb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18ec0 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
18ed0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18ee0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
18ef0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18f00 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
18f10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
18f20 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
18f30 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
18f40 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
18f50 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
18f60 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
18f70 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
18f80 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
18f90 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
18fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
18fb0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
18fc0 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
18fd0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
18fe0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
18ff0 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
19000 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
19010 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
19020 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
19030 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
19040 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
19050 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
19060 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
19070 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
19080 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
19090 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
190a0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
190b0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
190c0 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
190d0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
190e0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
190f0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
19100 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
19110 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
19120 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
19130 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
19140 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
19150 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
19160 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
19170 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
19180 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
19190 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
191a0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
191b0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
191c0 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
191d0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
191e0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
191f0 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
19200 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
19210 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
19220 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
19230 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
19240 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
19250 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
19260 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
19270 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
19280 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19290 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
192a0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
192b0 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
192c0 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
192d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
192e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
192f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19300 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19310 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
19320 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
19330 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
19340 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
19350 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19360 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
19370 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
19380 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
19390 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
193a0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
193b0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
193c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
193d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
193e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
193f0 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
19400 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
19410 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
19420 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
19430 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
19440 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
19450 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
19460 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
19470 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
19480 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
19490 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
194a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
194b0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
194c0 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
194d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
194e0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
194f0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
19500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
19510 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
19520 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
19530 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19540 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
19550 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
19560 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
19570 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
19580 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
19590 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
195a0 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
195b0 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
195c0 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
195d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
195e0 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
195f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19600 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
19610 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
19620 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19630 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
19640 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
19650 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
19660 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  G)!=0.  ){.    p
19670 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
19680 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
19690 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
196a0 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
196b0 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
196c0 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
196d0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
196e0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
196f0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
19700 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
19710 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
19720 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
19730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19750 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
19760 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
19770 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
19780 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
19790 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
197a0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
197b0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
197c0 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
197d0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
197e0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
197f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
19800 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
19810 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
19820 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
19830 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
19840 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
19850 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
19860 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
19870 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
19880 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
19890 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
198a0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
198b0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
198c0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
198d0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
198e0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
198f0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
19900 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
19910 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
19920 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
19930 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
19940 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19950 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
19960 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
19970 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
19980 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
19990 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
199a0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
199b0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
199c0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
199d0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
199e0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
199f0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
19a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
19a10 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
19a20 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
19a30 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
19a40 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
19a50 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
19a60 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
19a70 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
19a80 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
19a90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
19aa0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
19ab0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
19ac0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
19ad0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
19ae0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
19af0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
19b00 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
19b10 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
19b20 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
19b30 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
19b40 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
19b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19b60 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
19b70 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
19b80 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
19b90 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
19ba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
19bb0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
19bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
19bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
19be0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
19bf0 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
19c00 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
19c10 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
19c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
19c40 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
19c50 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
19c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
19c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
19c90 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19ca0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
19cb0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
19cc0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
19cd0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
19ce0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
19cf0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
19d00 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
19d10 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
19d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19d30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
19d40 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
19d50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
19d60 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
19d70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19d80 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19d90 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
19da0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
19db0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
19dc0 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
19dd0 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
19de0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
19df0 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
19e00 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
19e10 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
19e20 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
19e30 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
19e40 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
19e50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
19e60 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19e70 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
19e80 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
19e90 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
19ea0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
19eb0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
19ec0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
19ed0 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
19ee0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
19ef0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
19f00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19f10 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
19f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19f30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
19f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
19f50 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
19f60 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
19f70 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
19f80 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
19f90 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
19fa0 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
19fb0 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
19fc0 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
19fd0 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
19fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
19ff0 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1a000 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1a010 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1a020 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1a030 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1a040 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1a050 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1a060 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1a070 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1a080 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1a090 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1a0a0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1a0b0 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1a0c0 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1a0d0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1a0e0 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1a0f0 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1a100 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1a110 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1a120 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1a130 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1a140 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1a150 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1a160 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1a170 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1a180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a190 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1a1a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1a1b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a1c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a1d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1a1e0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1a1f0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1a200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a210 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1a220 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1a230 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1a240 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1a250 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1a260 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1a270 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1a280 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1a290 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1a2a0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1a2b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1a2c0 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1a2d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1a2e0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1a2f0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1a300 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1a310 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1a320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a330 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1a340 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1a350 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1a360 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1a370 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1a380 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a390 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a3a0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1a3b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a3c0 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1a3d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1a3e0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1a3f0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1a400 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1a410 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1a420 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1a430 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1a440 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1a450 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1a460 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1a470 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1a480 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1a490 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1a4a0 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1a4b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a4e0 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1a4f0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a520 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1a530 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1a540 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a570 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1a580 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1a590 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
1a5a0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
1a5b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1a5c0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1a5d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a5e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1a5f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1a600 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1a610 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1a620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a630 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
1a640 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1a650 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
1a660 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1a670 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1a680 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1a690 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1a6a0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1a6b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1a6c0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1a6d0 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1a6e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1a6f0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1a700 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1a710 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1a720 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1a730 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1a740 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1a750 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1a760 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1a770 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1a780 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1a790 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1a7a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1a7b0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1a7c0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1a7d0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1a7e0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1a7f0 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
1a800 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
1a810 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1a820 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
1a830 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1a840 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1a850 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1a860 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1a870 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1a880 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1a890 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1a8a0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1a8b0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1a8c0 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1a8d0 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1a8e0 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1a8f0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1a900 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1a910 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1a920 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1a930 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1a960 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1a970 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1a980 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1a990 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1a9a0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1a9b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a9c0 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1a9d0 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1a9e0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1a9f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1aa00 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1aa10 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1aa20 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1aa30 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1aa40 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1aa50 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1aa60 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1aa70 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1aa80 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1aa90 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1aaa0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1aab0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1aac0 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1aad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1aae0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1aaf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1ab00 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1ab10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1ab20 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1ab30 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1ab40 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1ab50 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1ab60 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1ab70 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1ab80 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1ab90 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1aba0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1abb0 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1abc0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1abd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1abe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1abf0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1ac00 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1ac10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
1ac20 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
1ac30 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
1ac40 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
1ac50 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ell;.    int rc;
1ac60 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ..    rc = btree
1ac70 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1ac80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ac90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1aca0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1acb0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1acc0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1acd0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1ace0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1acf0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1ad00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1ad10 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1ad20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1ad30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1ad40 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1ad50 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1ad60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1ad70 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
1ad80 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
1ad90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
1ada0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
1adb0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
1adc0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
1add0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
1ade0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1adf0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1ae00 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1ae10 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1ae20 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
1ae30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ae40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ae50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1ae60 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1ae70 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1ae80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1ae90 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1aea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aeb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1aec0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1aed0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1aee0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1aef0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1af00 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1af10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1af20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1af30 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1af40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1af50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1af60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1af70 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1af80 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1af90 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1afa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1afb0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1afc0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
1afd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1afe0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1aff0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1b000 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1b010 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1b020 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1b030 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1b040 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1b050 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1b060 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1b070 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1b080 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1b090 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1b0a0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1b0b0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1b0c0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1b0d0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1b0e0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1b0f0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1b100 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1b110 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1b120 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1b130 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1b140 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1b150 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1b160 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1b170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1b180 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1b190 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1b1a0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1b1b0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1b1c0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1b1d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1b1e0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1b1f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1b200 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1b210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1b220 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1b230 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1b240 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1b250 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1b260 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1b270 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1b280 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1b290 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1b2a0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1b2b0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1b2c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1b2d0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1b2e0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1b2f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1b300 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1b310 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1b320 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1b330 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1b340 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1b350 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1b360 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1b370 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1b380 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1b390 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1b3a0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1b3b0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1b3c0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1b3d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1b3e0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1b3f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b400 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1b420 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1b430 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1b440 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1b450 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1b460 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1b470 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1b480 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1b490 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1b4a0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1b4b0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1b4c0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1b4d0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1b4e0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1b4f0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1b500 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1b510 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1b520 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1b530 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1b540 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1b560 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1b570 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1b580 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1b590 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1b5a0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1b5b0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1b5c0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1b5d0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1b5e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1b5f0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1b600 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1b610 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1b620 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1b630 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1b640 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1b650 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1b660 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1b670 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1b680 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1b690 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1b6a0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1b6b0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1b6c0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1b6d0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1b6e0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1b6f0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1b700 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1b710 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1b720 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1b730 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1b740 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1b750 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1b760 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1b770 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1b780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b790 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1b7a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1b7b0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1b7c0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1b7d0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1b7e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1b7f0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1b800 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1b810 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1b820 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1b830 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1b840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1b860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b870 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b880 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1b890 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1b8a0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1b8b0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1b8c0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1b8d0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1b8e0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1b8f0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1b900 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1b910 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1b920 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1b930 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1b940 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1b950 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1b960 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1b970 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1b980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b990 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b9a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1b9b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1b9c0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1b9d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b9e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b9f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ba00 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1ba10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ba20 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1ba30 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1ba40 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1ba50 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1ba60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1ba70 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1ba80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ba90 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1baa0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1bab0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1bac0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1bad0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1bae0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1baf0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1bb00 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1bb10 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1bb20 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1bb30 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1bb40 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1bb50 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1bb60 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1bb70 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1bb80 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1bb90 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1bba0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1bbb0 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1bbc0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1bbd0 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1bbe0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1bbf0 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1bc00 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1bc10 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1bc20 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1bc30 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1bc40 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1bc50 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1bc60 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1bc70 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1bc80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1bc90 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1bca0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1bcb0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1bcc0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1bcd0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1bce0 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1bcf0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1bd00 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1bd10 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1bd20 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1bd30 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1bd40 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1bd50 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1bd60 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1bd70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1bd80 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1bd90 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1bda0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1bdb0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1bdc0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1bdd0 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1bde0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1bdf0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1be00 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1be10 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1be20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1be30 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1be40 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1be50 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1be60 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1be70 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1be80 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1be90 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1bea0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1beb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1bec0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1bed0 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1bee0 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1bef0 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1bf00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bf10 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1bf20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1bf30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bf40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1bf50 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1bf60 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1bf70 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1bf80 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1bf90 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1bfa0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1bfb0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1bfc0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1bfd0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1bfe0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1bff0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1c000 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1c010 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1c020 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1c030 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1c040 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1c050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1c060 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1c070 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1c080 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1c090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1c0b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c0c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1c0d0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1c0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c0f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1c110 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1c120 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1c130 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1c140 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1c150 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1c160 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1c170 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1c180 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1c190 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1c1a0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1c1b0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1c1c0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1c1d0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1c1e0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1c1f0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1c200 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1c210 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1c220 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1c230 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1c240 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1c250 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1c260 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1c270 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1c280 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1c290 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1c2a0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1c2b0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1c2c0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1c2d0 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1c2e0 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1c2f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1c310 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1c320 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1c330 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1c340 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1c350 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1c360 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c370 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1c380 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1c390 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1c3a0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1c3b0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1c3c0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1c3d0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1c3e0 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1c3f0 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1c400 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1c410 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1c420 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1c430 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1c440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1c450 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1c460 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1c470 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1c480 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1c490 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1c4a0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1c4b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c4e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1c4f0 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1c500 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1c510 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1c520 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1c530 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1c540 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1c550 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1c560 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1c570 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1c580 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1c590 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1c5a0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1c5b0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1c5c0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1c5d0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1c5e0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1c5f0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1c600 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1c610 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1c620 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1c630 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1c640 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1c650 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1c660 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1c670 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1c680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1c690 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1c6a0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1c6b0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1c6c0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1c6d0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1c6e0 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1c6f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c710 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1c720 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1c730 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c740 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1c750 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1c760 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1c770 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1c780 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1c790 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1c7a0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1c7b0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1c7c0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1c7d0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1c7e0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1c7f0 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1c800 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1c810 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1c820 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1c830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c860 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1c870 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1c880 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1c890 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1c8a0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1c8b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1c8c0 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1c8d0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1c8e0 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1c8f0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1c900 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1c910 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1c920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c930 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1c940 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1c950 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1c960 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1c970 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1c980 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1c990 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1c9a0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1c9b0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1c9c0 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1c9d0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1c9e0 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1c9f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1ca00 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1ca10 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1ca20 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1ca30 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1ca40 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1ca50 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca70 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1ca80 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1ca90 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1caa0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1cab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1cac0 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1cad0 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1cae0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1cb10 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1cb20 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1cb30 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1cb40 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1cb50 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1cb60 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1cb70 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1cb80 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1cb90 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1cba0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1cbb0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1cbc0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1cbd0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1cbe0 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1cbf0 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1cc00 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1cc10 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1cc20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1cc30 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1cc40 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1cc50 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1cc60 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1cc70 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1cc80 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1cc90 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1cca0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1ccb0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1ccc0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1ccd0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1cce0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1ccf0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1cd00 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1cd10 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1cd20 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1cd30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1cd40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1cd50 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1cd60 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1cd70 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1cd80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1cd90 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1cda0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1cdb0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1cdc0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1cdd0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1cde0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1cdf0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ce00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1ce10 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1ce20 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1ce30 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1ce40 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1ce50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1ce60 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1ce70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1ce80 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1ce90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1cea0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1ceb0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1cec0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1ced0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1cee0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1cef0 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1cf00 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1cf10 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1cf20 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1cf30 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1cf40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1cf50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1cf60 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1cf70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1cf80 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1cf90 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1cfa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cfb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1cfc0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1cfd0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1cfe0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1cff0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1d000 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1d010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d030 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d040 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d050 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1d060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1d070 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1d080 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1d090 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1d0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d0b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1d0c0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1d0d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1d0e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1d0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d100 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d110 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1d120 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1d130 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1d140 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1d150 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1d160 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1d170 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1d180 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d190 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1d1a0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1d1b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1d1c0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1d1d0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1d1e0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1d1f0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1d200 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1d210 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1d220 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1d230 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1d240 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1d250 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1d260 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1d270 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1d280 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1d290 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1d2a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d2b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d2c0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1d2d0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1d2e0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1d2f0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1d300 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
1d310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d320 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1d330 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1d340 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1d350 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1d360 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1d370 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1d380 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1d390 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1d3a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d3b0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1d3c0 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1d3d0 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1d3e0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1d3f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1d400 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1d410 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1d420 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1d430 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1d440 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1d450 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1d460 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1d470 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1d480 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1d490 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1d4a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1d4b0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1d4c0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1d4d0 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1d4e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d4f0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1d500 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1d510 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1d520 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1d530 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1d540 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1d550 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1d560 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1d570 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1d580 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1d590 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1d5a0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1d5b0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1d5c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1d5d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d5e0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1d5f0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1d600 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1d610 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1d620 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1d630 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1d640 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1d650 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1d660 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d670 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1d680 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1d690 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1d6a0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1d6b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1d6c0 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1d6d0 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1d6e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1d6f0 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1d700 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1d710 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1d720 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1d730 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1d740 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1d750 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1d760 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1d770 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d780 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1d790 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1d7a0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1d7b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1d7c0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1d7d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1d7e0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1d7f0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1d800 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1d810 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1d820 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1d830 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1d840 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1d850 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1d860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d880 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1d890 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1d8a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1d8b0 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1d8c0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1d8d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d8e0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1d8f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d900 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1d910 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1d920 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1d930 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1d940 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1d950 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1d960 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1d970 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1d980 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1d990 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1d9a0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1d9b0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1d9c0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1d9d0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1d9e0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1d9f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1da00 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1da10 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1da20 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1da30 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1da40 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1da50 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1da60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1da70 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1da80 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1da90 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1daa0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1dab0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1dac0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1dad0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1dae0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1daf0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1db00 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1db10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1db20 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1db30 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1db40 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1db50 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1db60 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1db70 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1db80 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1db90 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1dba0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1dbb0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1dbc0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1dbd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1dbe0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1dbf0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1dc00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1dc10 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1dc20 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1dc30 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1dc40 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1dc50 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1dc60 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1dc70 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1dc80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dc90 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1dca0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1dcb0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1dcc0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1dcd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1dce0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1dcf0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1dd00 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1dd10 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1dd20 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1dd30 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1dd40 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1dd50 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1dd60 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1dd70 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1dd80 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1dd90 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1dda0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1ddb0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1ddc0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1ddd0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1dde0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1ddf0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1de00 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1de10 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1de20 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1de30 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1de40 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1de50 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1de60 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1de70 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1de80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1de90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1dea0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1deb0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1dec0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1ded0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1dee0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1def0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1df00 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1df10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1df20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1df30 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1df40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1df50 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1df60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1df70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1df80 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1df90 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1dfa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dfb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1dfc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1dfd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dfe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dff0 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1e000 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1e010 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1e020 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1e030 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1e040 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1e050 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1e060 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1e070 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1e080 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1e090 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e0a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1e0b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e0c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e0d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1e0e0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1e0f0 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1e100 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1e110 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1e120 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1e130 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1e140 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1e150 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1e160 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1e170 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1e180 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1e190 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1e1a0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1e1b0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1e1c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e1d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1e1e0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1e1f0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1e200 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1e210 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1e220 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1e230 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1e240 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1e250 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1e260 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1e270 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1e280 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1e290 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1e2a0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1e2b0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1e2c0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1e2d0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1e2e0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1e2f0 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1e300 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1e310 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1e320 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1e330 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1e340 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1e350 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1e360 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1e370 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1e380 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1e390 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e3a0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1e3b0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1e3c0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1e3d0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1e3e0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1e3f0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1e400 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1e410 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1e420 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1e430 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1e440 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1e450 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1e460 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1e470 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1e480 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1e490 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1e4a0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1e4b0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1e4c0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1e4d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1e4e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1e4f0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1e500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e510 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1e520 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1e530 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1e540 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1e550 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1e560 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1e570 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1e580 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1e590 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1e5a0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1e5b0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1e5c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1e5d0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1e5e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1e5f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1e600 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1e610 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1e620 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1e630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1e640 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1e650 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1e660 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1e670 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1e680 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1e690 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1e6a0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1e6b0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1e6c0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1e6d0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1e6e0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1e6f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1e700 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1e710 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1e720 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1e730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1e740 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1e750 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1e760 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1e770 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1e780 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1e790 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1e7a0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1e7b0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1e7c0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1e7d0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1e7e0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1e7f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1e800 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1e810 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1e820 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1e830 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1e840 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1e850 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1e860 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1e870 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1e880 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1e890 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1e8a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1e8b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1e8c0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1e8d0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1e8e0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1e8f0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1e900 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1e910 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1e920 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1e930 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1e940 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1e950 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1e960 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1e970 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1e980 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1e990 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1e9a0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1e9b0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1e9c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1e9d0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1e9e0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1e9f0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1ea00 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1ea10 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1ea20 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1ea30 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1ea40 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1ea50 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1ea60 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1ea70 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1ea80 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1ea90 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1eaa0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1eab0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1eac0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1ead0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1eae0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1eaf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1eb00 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1eb10 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1eb20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1eb30 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1eb40 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1eb50 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1eb60 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1eb70 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1eb80 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1eb90 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1eba0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1ebb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ebc0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1ebd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ebe0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ebf0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1ec00 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1ec10 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1ec20 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1ec30 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1ec40 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1ec50 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1ec60 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1ec70 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1ec80 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1ec90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1eca0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ecb0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1ecc0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1ecd0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1ecf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ed00 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1ed10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1ed20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1ed30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ed40 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1ed50 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1ed60 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ed70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1ed80 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1ed90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1eda0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1edb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1edc0 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
1edd0 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
1ede0 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
1edf0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
1ee00 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
1ee10 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1ee20 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
1ee30 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
1ee40 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
1ee50 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1ee60 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1ee70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ee80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ee90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
1eea0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
1eeb0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
1eec0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1eed0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
1eee0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1eef0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ef00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1ef10 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1ef20 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
1ef30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ef50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1ef60 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
1ef70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ef80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ef90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1efa0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1efb0 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
1efc0 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
1efd0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
1efe0 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
1eff0 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
1f000 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1f010 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1f020 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
1f030 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
1f040 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
1f050 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
1f060 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
1f070 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
1f080 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
1f090 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
1f0a0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
1f0b0 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
1f0c0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1f0d0 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
1f0e0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1f0f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1f100 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
1f110 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
1f120 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1f130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f140 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1f150 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1f160 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
1f170 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
1f180 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
1f190 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
1f1a0 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
1f1b0 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
1f1c0 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
1f1d0 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
1f1e0 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
1f1f0 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
1f200 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
1f210 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
1f220 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
1f230 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
1f240 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
1f250 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
1f260 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
1f270 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
1f280 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
1f290 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
1f2a0 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
1f2b0 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
1f2c0 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
1f2d0 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
1f2e0 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
1f2f0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
1f300 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
1f310 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
1f320 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
1f330 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
1f340 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1f350 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
1f360 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
1f370 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1f380 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
1f390 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
1f3a0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
1f3b0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
1f3c0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
1f3d0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
1f3e0 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
1f3f0 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
1f400 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f410 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
1f420 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
1f430 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1f440 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
1f450 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
1f460 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1f470 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
1f480 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1f490 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
1f4a0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
1f4b0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
1f4c0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1f4d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f4e0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1f4f0 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
1f500 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
1f510 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
1f520 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
1f530 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
1f540 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f550 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
1f560 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1f570 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1f580 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1f590 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
1f5a0 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
1f5b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
1f5c0 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
1f5d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1f5e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f5f0 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
1f600 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
1f610 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
1f620 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
1f630 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
1f640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f660 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
1f670 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1f680 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
1f690 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
1f6a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f6c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1f6e0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
1f6f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
1f700 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
1f710 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
1f720 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
1f730 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
1f740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
1f750 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1f760 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f770 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
1f780 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
1f790 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
1f7a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1f7b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1f7c0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1f7d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f7e0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
1f7f0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
1f800 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
1f810 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
1f820 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
1f830 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
1f840 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
1f850 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
1f860 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
1f870 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
1f880 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
1f890 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1f8a0 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
1f8b0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
1f8c0 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
1f8d0 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
1f8e0 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
1f8f0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
1f900 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
1f910 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1f920 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1f930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f940 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
1f950 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
1f960 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
1f970 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
1f980 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
1f990 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
1f9a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
1f9b0 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
1f9c0 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
1f9d0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1f9e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1f9f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1fa00 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
1fa10 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
1fa20 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
1fa30 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
1fa40 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
1fa50 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
1fa60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1fa70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1fa80 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
1fa90 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
1faa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
1fab0 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
1fac0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1fad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fae0 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
1faf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1fb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1fb10 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1fb20 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
1fb30 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1fb40 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
1fb50 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
1fb60 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
1fb70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1fb80 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
1fb90 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
1fba0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
1fbb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
1fbc0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
1fbd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1fbe0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1fbf0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1fc00 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1fc10 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
1fc20 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
1fc30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
1fc40 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
1fc50 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1fc60 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1fc70 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
1fc80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1fc90 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1fca0 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
1fcb0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
1fcc0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
1fcd0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
1fce0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
1fcf0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
1fd00 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
1fd10 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1fd20 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
1fd30 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
1fd40 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
1fd50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
1fd60 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
1fd70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fd80 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
1fd90 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
1fda0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1fdb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
1fdc0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1fdd0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
1fde0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1fdf0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1fe00 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1fe10 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
1fe20 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
1fe30 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1fe40 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1fe50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1fe60 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
1fe70 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1fe80 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
1fe90 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1fea0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1feb0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1fec0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1fed0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1fee0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1fef0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1ff00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ff10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ff20 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1ff30 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1ff40 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1ff50 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1ff60 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
1ff70 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
1ff80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
1ff90 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
1ffa0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
1ffb0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
1ffc0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
1ffd0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1ffe0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1fff0 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
20000 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
20010 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
20020 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
20030 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
20040 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
20050 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
20060 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
20070 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
20080 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
20090 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
200a0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
200b0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
200c0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
200d0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
200e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
200f0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
20100 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
20110 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
20120 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
20130 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
20140 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
20150 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
20160 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
20170 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
20180 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
20190 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
201a0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
201b0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
201c0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
201d0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
201e0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
201f0 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
20200 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
20210 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
20220 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
20230 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
20240 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
20250 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
20260 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
20270 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
20280 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
20290 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
202a0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
202b0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
202c0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
202d0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
202e0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
202f0 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
20300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20310 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
20320 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
20330 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
20340 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
20350 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20360 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20370 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
20380 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20390 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
203a0 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
203b0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
203c0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
203d0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
203e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
203f0 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
20400 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
20410 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
20420 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
20430 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
20440 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
20450 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
20460 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20470 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
20480 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
20490 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
204a0 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
204b0 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
204c0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
204d0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
204e0 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
204f0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
20500 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
20510 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
20520 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
20530 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
20540 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
20550 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
20560 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
20570 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
20580 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
20590 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
205a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
205b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
205c0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
205d0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
205e0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
205f0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
20600 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
20610 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
20620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
20630 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
20640 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
20650 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
20660 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
20670 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
20680 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
20690 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
206a0 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
206b0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
206c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
206d0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
206e0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
206f0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
20700 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
20710 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
20720 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
20730 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
20740 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
20750 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
20760 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
20770 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
20780 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
20790 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
207a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
207b0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
207c0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
207d0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
207e0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
207f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
20800 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
20810 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
20820 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
20830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20840 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
20850 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
20860 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
20870 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20880 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
20890 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
208a0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
208b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
208c0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
208d0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
208e0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
208f0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
20900 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
20910 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20920 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
20930 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
20940 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
20950 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
20960 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20980 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
20990 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
209a0 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
209b0 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
209c0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
209d0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
209e0 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
209f0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
20a00 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
20a10 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
20a20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20a30 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
20a40 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20a50 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
20a60 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
20a70 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
20a80 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
20a90 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
20aa0 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
20ab0 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
20ac0 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
20ad0 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
20ae0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
20af0 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
20b00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20b10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
20b40 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
20b50 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
20b60 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
20b70 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
20b80 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
20b90 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
20ba0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
20bb0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
20bc0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
20bd0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
20be0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
20bf0 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
20c00 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
20c10 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
20c20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
20c30 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
20c40 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
20c50 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
20c60 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
20c70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
20c80 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
20c90 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
20ca0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
20cb0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
20cc0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
20cd0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
20ce0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
20cf0 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
20d00 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
20d10 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
20d20 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
20d30 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
20d40 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
20d50 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
20d60 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
20d70 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
20d80 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
20d90 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
20da0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
20db0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
20dc0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
20dd0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20de0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
20df0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
20e00 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
20e10 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
20e20 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
20e30 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
20e40 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
20e50 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
20e60 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
20e70 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
20e80 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
20e90 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
20ea0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
20eb0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
20ec0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
20ed0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
20ee0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
20ef0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20f00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
20f10 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
20f20 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
20f30 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
20f40 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
20f50 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
20f60 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
20f70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
20f80 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
20f90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
20fa0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
20fb0 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
20fc0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
20fd0 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
20fe0 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
20ff0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
21000 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
21010 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
21020 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
21030 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
21040 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
21050 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
21060 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
21070 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
21080 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
21090 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
210a0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
210b0 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
210c0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210f0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
21100 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
21130 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
21140 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
21150 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
21180 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
21190 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
211a0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
211b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
211c0 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
211d0 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
211e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
21210 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
21220 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
21230 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21250 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
21260 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  andle */..  asse
21270 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21280 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
21290 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
212a0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
212b0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
212c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
212d0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
212e0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
212f0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
21300 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
21310 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
21320 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
21330 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
21340 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
21350 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
21360 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
21370 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
21380 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
21390 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
213a0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
213b0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
213c0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
213d0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
213e0 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
213f0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
21400 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
21410 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
21420 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
21430 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
21440 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
21450 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
21460 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
21470 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
21480 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
21490 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
214a0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
214b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
214c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
214d0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
214e0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
214f0 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c    if( NEVER(wrFl
21500 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ag && (pBt->btsF
21510 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
21520 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20  ONLY)!=0) ){.   
21530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
21540 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
21550 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
21560 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
21570 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
21580 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
21590 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
215a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
215b0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
215c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
215d0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
215e0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
215f0 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
21600 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
21610 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
21620 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
21630 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
21640 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
21650 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
21660 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
21670 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
21680 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
21690 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
216a0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
216b0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
216c0 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
216d0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
216e0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
216f0 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
21700 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72  t = pBt;.  asser
21710 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
21720 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69  wrFlag==BTCF_Wri
21730 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72  teFlag );.  pCur
21740 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
21750 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
21760 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
21770 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
21780 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
21790 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
217a0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
217b0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
217c0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
217d0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
217e0 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
217f0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
21800 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
21810 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21840 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
21850 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21880 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
21890 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
218a0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
218d0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
218e0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
218f0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
21900 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
21910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21920 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
21930 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
21940 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
21970 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
21980 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
21990 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20  f( iTable<1 ){. 
219a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
219b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
219c0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
219d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
219e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
219f0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
21a00 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
21a10 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , pCur);.    sql
21a20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21a30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21a40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
21a50 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
21a60 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
21a70 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
21a80 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
21a90 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
21aa0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
21ab0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
21ac0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
21ad0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
21ae0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
21af0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
21b00 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
21b10 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
21b20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
21b30 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
21b40 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
21b50 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
21b60 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
21b70 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
21b80 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
21b90 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
21ba0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
21bb0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
21bc0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
21bd0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
21be0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
21bf0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
21c00 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
21c10 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
21c20 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
21c30 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
21c40 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
21c50 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
21c60 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
21c70 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
21c80 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
21c90 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
21ca0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
21cb0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
21cc0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
21cd0 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
21ce0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
21cf0 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
21d00 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
21d10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
21d20 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
21d30 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
21d40 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
21d50 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
21d60 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
21d70 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
21d80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21d90 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
21da0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
21db0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
21dc0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
21dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
21de0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
21df0 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
21e00 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
21e10 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
21e20 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
21e30 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
21e40 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
21e50 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
21e60 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
21e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21e80 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
21e90 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
21ea0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
21eb0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
21ec0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
21ed0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
21ee0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
21ef0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
21f00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
21f10 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
21f20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
21f30 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
21f40 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
21f50 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
21f60 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
21f70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21f80 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
21f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
21fa0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
21fb0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
21fc0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
21fd0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
21fe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
21ff0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
22000 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
22010 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
22020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22030 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
22040 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
22050 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
22060 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
22070 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
22080 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
22090 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
220a0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
220b0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
220c0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
220d0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
220e0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
220f0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
22100 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
22110 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
22120 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
22130 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
22140 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
22150 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
22160 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
22170 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
22180 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
22190 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
221a0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
221b0 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
221c0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
221d0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
221e0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
221f0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
22200 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
22210 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
22220 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
22230 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
22240 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
22250 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
22260 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
22270 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
22280 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
22290 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
222a0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
222b0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
222c0 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
222d0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
222e0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
222f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
22300 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
22310 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
22320 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
22330 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
22340 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
22350 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
22360 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
22370 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
22380 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
22390 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
223a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
223b0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
223c0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
223d0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
223e0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
223f0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
22400 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
22410 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
22420 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
22430 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
22440 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
22450 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
22460 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
22470 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
22480 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
22490 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
224a0 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
224b0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
224c0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
224d0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
224e0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
224f0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
22500 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
22510 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
22520 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22530 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
22540 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
22550 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
22560 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
22570 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
22580 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
22590 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
225a0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
225b0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
225c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
225d0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
225e0 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
225f0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
22600 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
22610 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
22620 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
22630 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
22640 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
22650 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
22660 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
22670 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
22680 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
22690 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
226a0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
226b0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
226c0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
226d0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
226e0 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
226f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
22700 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
22710 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
22720 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
22730 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
22740 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22750 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22760 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22770 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22780 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
22790 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
227a0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
227b0 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
227c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
227d0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
227e0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
227f0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
22800 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
22810 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
22820 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
22830 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
22840 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
22850 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
22860 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
22870 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
22880 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
22890 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
228a0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
228b0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
228c0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
228d0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
228e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
228f0 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
22900 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
22910 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
22920 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
22930 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
22940 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
22950 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
22960 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
22970 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
22980 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
22990 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
229a0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
229b0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
229c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
229d0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
229e0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
229f0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
22a00 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22a10 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22a20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22a30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22a50 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
22a60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22a70 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
22a80 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
22a90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22aa0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22ab0 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
22ac0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
22ad0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
22ae0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
22af0 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
22b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22b10 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
22b20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
22b30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
22b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
22b50 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
22b60 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
22b70 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22b80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22b90 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22ba0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22bb0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22bc0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
22bd0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
22be0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
22bf0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
22c00 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
22c10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
22c20 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
22c30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
22c40 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
22c50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
22c60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
22c70 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22c80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22c90 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22ca0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22cb0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22cc0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
22cd0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
22ce0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
22cf0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
22d00 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
22d10 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
22d20 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
22d30 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
22d40 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
22d50 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
22d60 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
22d70 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22d80 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22d90 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22da0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22db0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22dc0 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
22dd0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
22de0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
22df0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
22e00 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
22e10 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
22e20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
22e30 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
22e40 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
22e50 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
22e60 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
22e70 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22e80 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22e90 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22ea0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22eb0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
22ed0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
22ee0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22f10 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
22f40 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22f50 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
22f60 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
22f70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22f80 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22f90 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22fa0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22fc0 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
22fd0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
22fe0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
22ff0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
23000 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
23010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23020 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
23030 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23040 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
23050 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
23060 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23070 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23080 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
23090 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
230a0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
230b0 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
230c0 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
230d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
230e0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
230f0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
23100 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
23110 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
23120 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
23130 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
23140 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
23150 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
23160 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
23170 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
23180 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
23190 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
231a0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
231b0 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
231c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
231d0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
231e0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
231f0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
23200 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
23210 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
23220 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
23230 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
23240 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23250 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
23260 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
23270 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
23280 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
23290 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
232a0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
232b0 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
232c0 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
232d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
232e0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
232f0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
23300 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
23310 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
23320 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
23330 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
23340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
23350 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
23360 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
23370 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
23380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23390 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
233a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
233b0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
233c0 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
233d0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
233e0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
233f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23400 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
23410 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
23430 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
23440 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
23450 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
23460 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
23470 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
23480 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
23490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
234a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
234b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
234c0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
234d0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
234e0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
234f0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
23500 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
23510 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
23520 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
23530 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
23540 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
23550 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
23560 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
23570 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
23580 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
23590 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
235a0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
235b0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
235c0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
235d0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
235e0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
235f0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
23600 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
23610 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
23620 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
23630 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
23640 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
23650 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
23660 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
23670 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
23680 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
23690 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
236a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
236b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
236c0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
236d0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
236e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
236f0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
23700 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23720 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
23730 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
23740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23760 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
23770 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
23780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
23790 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
237a0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
237b0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
237c0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
237d0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
237e0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
237f0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
23800 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
23810 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
23820 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
23830 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
23840 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
23850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
23860 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
23870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
238a0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
238b0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
238c0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
238d0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
238e0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
238f0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
23900 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
23910 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
23920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
23930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
23940 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23950 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
23960 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
23970 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
23980 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
23990 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
239a0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
239b0 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
239c0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
239d0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
239e0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
239f0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
23a00 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
23a10 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
23a20 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
23a30 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
23a40 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
23a50 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
23a60 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
23a70 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
23a80 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
23a90 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23aa0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
23ab0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
23ac0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
23ad0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
23ae0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
23af0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
23b00 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
23b10 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
23b20 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
23b30 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
23b40 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
23b50 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
23b60 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
23b70 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23b80 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23b90 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23ba0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23bb0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23bc0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23bd0 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
23be0 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
23bf0 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
23c00 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
23c10 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
23c20 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
23c30 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
23c40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23c50 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
23c60 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
23c70 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23c80 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23c90 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23ca0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23cb0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23cc0 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
23cd0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
23ce0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23cf0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23d00 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
23d10 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
23d20 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
23d30 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
23d40 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
23d50 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
23d60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
23d70 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23d80 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23d90 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23da0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23db0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23dc0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
23dd0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23de0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
23df0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
23e00 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
23e10 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
23e20 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
23e30 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
23e40 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
23e50 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
23e60 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
23e70 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23e80 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23e90 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23ea0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23eb0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23ec0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
23ed0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
23ee0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
23ef0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
23f00 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
23f10 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
23f20 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
23f30 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
23f40 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
23f50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
23f60 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
23f70 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23f80 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23f90 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23fa0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23fb0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23fc0 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
23fd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
23fe0 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
23ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24000 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
24010 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24020 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24030 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
24040 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
24050 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
24060 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24070 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
24080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
24090 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
240a0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
240b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
240c0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
240d0 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
240e0 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
240f0 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
24100 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24130 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
24140 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
24150 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
24160 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
24170 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24180 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
241a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
241b0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
241c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
241d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
241e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
241f0 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
24200 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
24210 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
24220 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
24230 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
24240 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
24250 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
24260 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
24270 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24280 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
24290 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
242a0 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
242b0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
242c0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
242d0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
242e0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
242f0 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
24300 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
24310 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
24320 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
24330 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
24340 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
24350 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
24360 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
24370 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
24380 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
24390 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
243a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
243b0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
243c0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
243d0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
243e0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
243f0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
24400 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
24410 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
24420 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
24430 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
24440 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
24450 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
24460 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
24470 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
24480 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
24490 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
244a0 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
244b0 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
244c0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
244d0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
244e0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
244f0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
24500 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
24510 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
24520 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
24530 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
24540 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
24550 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
24560 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
24570 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
24580 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
24590 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
245a0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
245b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
245c0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
245d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
245e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
245f0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
24600 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
24610 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
24620 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
24630 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
24640 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
24650 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
24660 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
24670 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
24680 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
24690 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
246a0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
246b0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
246c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
246d0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
246e0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
246f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
24700 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
24710 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
24720 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
24730 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
24740 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
24750 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
24760 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
24770 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
24780 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
24790 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
247a0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
247b0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
247c0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
247d0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
247e0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
247f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
24800 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
24810 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
24820 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
24830 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
24840 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
24850 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
24860 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
24870 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
24880 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
24890 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
248a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
248b0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
248c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
248d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
248e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
248f0 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
24900 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
24910 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
24920 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
24930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24940 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
24950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
24970 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
24980 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
24990 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
249a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
249b0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
249c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
249d0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
249e0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
249f0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
24a00 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
24a10 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
24a20 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
24a30 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
24a40 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
24a50 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
24a60 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
24a70 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24a80 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24a90 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
24aa0 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
24ab0 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
24ac0 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
24ad0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
24ae0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
24af0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
24b00 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
24b10 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
24b20 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
24b30 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
24b40 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
24b50 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
24b60 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
24b70 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
24b80 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
24b90 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
24ba0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24bb0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
24bc0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
24bd0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24be0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24bf0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
24c00 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
24c10 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
24c20 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
24c30 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
24c40 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
24c50 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
24c60 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
24c70 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
24c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24c90 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
24ca0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
24cb0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
24cc0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
24cd0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
24ce0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
24cf0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
24d00 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
24d10 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
24d20 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
24d30 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
24d40 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
24d50 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
24d60 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
24d70 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
24d80 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
24d90 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
24da0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
24db0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24dc0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
24dd0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
24de0 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
24df0 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
24e00 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
24e10 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
24e20 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
24e30 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
24e40 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
24e50 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
24e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
24e70 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
24e80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
24e90 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24ea0 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
24eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24ec0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
24ed0 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
24ee0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
24ef0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
24f00 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
24f10 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
24f20 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
24f30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24f40 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
24f50 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
24f60 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
24f70 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24f80 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
24f90 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
24fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24fb0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
24fc0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
24fd0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
24fe0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
24ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
25000 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
25010 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
25020 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
25030 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
25040 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
25050 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25060 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
25070 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
25080 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
25090 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
250a0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
250b0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
250c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
250d0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
250e0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
250f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
25100 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
25110 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
25120 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
25130 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
25140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25150 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
25160 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
25170 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
25180 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
25190 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
251a0 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
251b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
251c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
251d0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
251e0 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
251f0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
25200 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
25210 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
25220 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
25230 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
25240 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
25250 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
25260 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
25270 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
25280 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
25290 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
252a0 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
252b0 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
252c0 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
252d0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
252e0 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
252f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
25300 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
25310 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
25320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25330 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
25340 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
25350 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
25360 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
25370 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
25380 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
25390 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
253a0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
253b0 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
253c0 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
253d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
253e0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
25420 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
25430 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
25460 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
25470 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
25480 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
254b0 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
254c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
254d0 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
254f0 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
25500 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
25510 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
25520 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
25530 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
25540 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
25550 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
25560 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25580 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
25590 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
255a0 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255c0 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
255d0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
255e0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
255f0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
25600 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
25610 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
25620 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
25630 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
25660 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
25670 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
25680 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
25690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
256a0 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
256b0 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
256c0 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
256d0 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
256e0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
256f0 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
25700 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
25710 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
25720 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
25730 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
25740 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
25750 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
25760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25770 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
25780 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
25790 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
257a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
257b0 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
257c0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
257d0 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
257e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
257f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25810 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
25820 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
25830 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
25840 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
25850 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
25860 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
25870 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
25880 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
25890 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
258a0 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
258b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
258c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
258d0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
258e0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
258f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
25900 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
25910 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
25920 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
25930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25940 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
25950 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
25960 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
25970 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25980 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
25990 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
259a0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
259b0 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
259c0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
259d0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
259e0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
259f0 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
25a00 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
25a10 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
25a20 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
25a30 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
25a40 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
25a50 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
25a60 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
25a70 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
25a80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25a90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25aa0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
25ab0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
25ac0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
25ad0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
25ae0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
25af0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
25b00 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
25b10 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
25b20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25b30 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
25b40 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25b50 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25b60 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
25b70 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25b80 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25b90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25ba0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25bc0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
25bd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25be0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25bf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25c00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
25c10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25c20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25c30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
25c40 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
25c50 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
25c60 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
25c70 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
25c80 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
25c90 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
25ca0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
25cb0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
25cc0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
25cd0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
25ce0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
25cf0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
25d00 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
25d10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
25d20 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25d30 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
25d40 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
25d50 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
25d60 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
25d70 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
25d80 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
25d90 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
25da0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
25db0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25dc0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
25dd0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25de0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25df0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
25e00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
25e10 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
25e20 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
25e30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
25e40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
25e50 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
25e60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
25e70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25e80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25e90 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25ea0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25eb0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
25ed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25ee0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25ef0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
25f00 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25f10 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
25f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
25f30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25f40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25f50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
25f60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25f70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
25f80 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
25f90 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
25fa0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
25fb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25fc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25fd0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
25fe0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
25ff0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
26000 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
26010 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
26020 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
26030 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
26040 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
26050 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
26060 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
26070 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
26080 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
26090 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
260a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
260b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
260c0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
260d0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
260e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
260f0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
26100 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
26110 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
26120 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
26130 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
26140 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26150 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
26160 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
26170 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
26180 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
26190 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
261a0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
261b0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
261c0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
261d0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
261e0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
261f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
26200 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
26210 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
26220 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
26230 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
26240 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
26250 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
26260 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
26270 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
26280 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
26290 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
262a0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
262b0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
262c0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
262d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
262e0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
262f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
26300 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
26310 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
26320 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
26330 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
26340 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
26350 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
26360 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
26370 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
26380 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
26390 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
263a0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
263b0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
263c0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
263d0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
263e0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
263f0 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
26400 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
26410 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
26420 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
26430 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
26440 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
26450 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
26460 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
26470 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
26480 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26490 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
264a0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
264b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
264c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
264d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
264e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
264f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26510 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26520 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
26530 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26540 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
26550 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
26560 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
26570 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
26580 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
26590 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
265a0 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
265b0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
265c0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
265d0 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
265e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
265f0 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
26600 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
26610 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
26620 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26630 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
26640 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
26650 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
26660 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
26670 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
26680 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
26690 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
266a0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
266b0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
266c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
266d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
266e0 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
266f0 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
26700 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
26710 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
26720 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
26730 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
26740 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
26750 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
26760 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
26770 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
26780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
26790 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
267a0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
267b0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
267c0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
267d0 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
267e0 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
267f0 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
26800 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
26810 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
26820 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
26830 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
26840 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
26850 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
26860 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
26870 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
26880 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
26890 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
268a0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
268b0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
268c0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
268d0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
268e0 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
268f0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
26900 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
26910 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
26920 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
26930 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
26940 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
26950 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
26960 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20   pAmt);.}.const 
26970 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
26980 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
26990 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
269a0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
269b0 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
269c0 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
269d0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
269e0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
269f0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
26a00 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
26a10 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
26a20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26a30 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
26a40 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
26a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
26a60 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
26a70 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
26a80 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
26a90 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
26aa0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
26ab0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
26ac0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
26ad0 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
26ae0 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
26af0 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
26b00 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
26b10 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
26b20 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
26b30 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
26b40 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
26b50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26b60 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
26b70 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
26b80 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
26b90 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
26ba0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
26bb0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
26bc0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26bd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26be0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26bf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26c00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26c10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
26c20 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
26c30 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
26c40 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
26c50 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
26c60 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
26c70 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
26c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26c90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26ca0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
26cb0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
26cc0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
26cd0 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
26ce0 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46       (pCur->curF
26cf0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
26d00 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45  eFlag)==0 ? PAGE
26d10 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26d20 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
26d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
26d40 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
26d50 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
26d60 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
26d70 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
26d80 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
26d90 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
26da0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
26db0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
26dc0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
26dd0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  );.  if( pNewPag
26de0 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
26df0 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
26e00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
26e10 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
26e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26e30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
26e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26e50 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
26e60 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
26e70 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
26e80 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
26e90 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
26ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
26eb0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
26ec0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
26ed0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
26ee0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
26ef0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
26f00 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
26f10 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
26f20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
26f30 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
26f40 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
26f50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
26f60 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
26f70 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
26f80 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
26f90 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
26fa0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
26fb0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
26fc0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
26fd0 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
26fe0 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
26ff0 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
27000 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
27010 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
27040 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
27050 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
27060 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
27070 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
27080 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
27090 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
270a0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
270b0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
270c0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
270d0 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
270e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
270f0 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
27100 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
27110 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
27120 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
27130 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
27140 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
27150 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
27160 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
27170 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
27180 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
27190 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
271a0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
271b0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
271c0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
271d0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
271e0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
271f0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
27200 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
27210 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
27220 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
27230 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
27240 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
27250 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
27260 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27270 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
27280 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
27290 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
272a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
272b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
272c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
272d0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
272e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
272f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27300 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27310 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
27320 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
27330 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
27340 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
27350 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
27360 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
27370 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
27380 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27390 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  ]->pgno.  );.  t
273a0 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
273b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
273c0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
273d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
273e0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
273f0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
27400 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27410 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
27420 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
27430 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
27440 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
27450 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
27460 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
27470 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  vfl);.}../*.** M
27480 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
27490 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
274a0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
274b0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
274c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
274d0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
274e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
274f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
27500 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
27510 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
27520 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
27530 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
27540 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
27550 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
27560 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27570 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
27580 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
27590 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
275a0 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
275b0 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
275c0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
275d0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
275e0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
275f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
27600 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
27610 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
27620 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
27630 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
27640 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
27650 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
27660 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
27670 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
27680 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
27690 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
276a0 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
276b0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
276c0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
276d0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
276e0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
276f0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
27700 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
27710 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
27720 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
27730 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
27740 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
27750 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
27760 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
27770 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
27780 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
27790 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
277a0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
277b0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
277c0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
277d0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
277e0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
277f0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
27800 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
27810 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
27820 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
27830 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
27840 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
27850 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
27860 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
27870 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
27880 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
27890 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
278a0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
278b0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
278c0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
278d0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
278e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
278f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27900 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27910 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
27920 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
27930 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
27940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
27950 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
27960 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
27970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
27980 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
27990 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
279a0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
279b0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
279c0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
279d0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
279e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
279f0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
27a00 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
27a10 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
27a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
27a30 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
27a40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
27a50 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
27a60 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
27a70 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27a80 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
27a90 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65  ur->iPage ) rele
27aa0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
27ab0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27ac0 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  --]);.  }else if
27ad0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
27af0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27b00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
27b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
27b30 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
27b40 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
27b50 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
27b60 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
27b70 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
27b80 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75         (pCur->cu
27b90 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
27ba0 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41  iteFlag)==0 ? PA
27bb0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
27bc0 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
27bd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27be0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
27bf0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
27c00 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
27c10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
27c20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
27c30 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
27c40 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
27c50 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
27c60 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
27c70 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
27c80 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
27c90 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
27ca0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
27cb0 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
27cc0 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
27cd0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
27ce0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
27cf0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
27d00 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
27d10 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
27d20 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
27d30 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
27d40 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
27d50 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
27d60 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
27d70 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
27d80 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
27d90 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
27da0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
27db0 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
27dc0 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
27dd0 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
27de0 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
27df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27e00 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
27e10 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
27e20 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
27e30 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
27e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27e50 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
27e60 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
27e70 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
27e80 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
27e90 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
27ea0 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
27eb0 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
27ec0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
27ed0 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
27ee0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
27ef0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
27f00 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
27f10 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
27f20 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
27f30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27f40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27f50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
27f60 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
27f70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27f80 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
27f90 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
27fa0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
27fb0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27fc0 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
27fd0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
27fe0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27ff0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
28000 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
28010 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
28020 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
28030 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
28040 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
28050 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28060 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
28070 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
28080 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
28090 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
280a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
280b0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
280c0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
280d0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
280e0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
280f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28100 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
28130 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
28140 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
28150 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
28160 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
28170 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
28180 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
28190 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
281a0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
281b0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
281c0 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
281d0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
281e0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
281f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28200 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
28210 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28220 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
28230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28240 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
28250 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
28260 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28270 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28280 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28290 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
282a0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
282b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
282c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
282d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
282e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
282f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
28300 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
28310 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28320 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
28330 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
28340 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
28350 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
28360 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
28370 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
28380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
283a0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
283b0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
283c0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
283d0 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
283e0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
283f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
28400 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
28410 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
28420 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
28430 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
28440 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
28450 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
28460 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
28470 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
28480 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
28490 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
284a0 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
284b0 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
284c0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
284d0 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
284e0 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
284f0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
28500 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
28510 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
28520 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
28530 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
28540 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28550 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
28560 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
28570 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
28580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28590 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
285a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
285b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
285c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
285d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
285e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
285f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
28600 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28610 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
28620 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
28630 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
28640 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
28650 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
28660 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
28670 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
28680 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
28690 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
286a0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
286b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
286c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
286d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
286e0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
286f0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
28700 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
28710 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
28720 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
28730 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
28740 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
28750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28760 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
28770 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
28780 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
28790 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
287a0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
287b0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
287c0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
287d0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
287e0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
287f0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
28800 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
28810 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
28820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
28830 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
28840 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
28850 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
28860 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28870 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
28890 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
288a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
288b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
288c0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
288d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
288e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
288f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28900 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
28910 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
28920 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
28930 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
28940 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28950 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
28960 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
28970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28990 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
289a0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
289b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
289c0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
289d0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
289e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
289f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
28a00 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
28a10 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
28a20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
28a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
28a40 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
28a50 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
28a60 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
28a70 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
28a80 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
28a90 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
28aa0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
28ab0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
28ac0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
28ad0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28ae0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28af0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
28b00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28b10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28b20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28b30 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
28b40 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
28b50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
28b60 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
28b70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
28b80 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
28b90 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
28ba0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
28bb0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
28bc0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28bd0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
28be0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
28bf0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
28c00 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
28c10 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
28c20 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
28c30 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
28c40 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
28c50 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
28c60 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
28c70 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
28c80 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
28c90 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
28ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28cb0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
28cc0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
28cd0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
28ce0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28cf0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28d00 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
28d10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28d20 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
28d30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
28d40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28d50 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
28d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28d70 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
28d80 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
28d90 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
28da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
28db0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
28dc0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
28dd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28de0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28df0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28e00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28e10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
28e20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
28e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28e40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28e50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28e60 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
28e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
28e80 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28e90 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
28ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28eb0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
28ec0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
28ed0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
28ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
28ef0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28f00 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
28f10 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
28f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28f30 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
28f40 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
28f50 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
28f60 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
28f70 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
28f80 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
28f90 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
28fa0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
28fb0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
28fc0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
28fd0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
28fe0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
28ff0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
29000 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
29010 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
29020 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
29030 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
29040 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
29050 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
29060 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
29070 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
29080 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
29090 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
290a0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
290b0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
290c0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
290d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
290e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
290f0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
29100 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
29110 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
29120 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
29130 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
29140 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
29150 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
29160 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
29170 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
29180 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
29190 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
291a0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
291b0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
291c0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
291d0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
291e0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
291f0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
29200 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
29210 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
29220 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
29230 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
29240 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
29250 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
29260 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
29270 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
29280 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
29290 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
292a0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
292b0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
292c0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
292d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
292e0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
292f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
29300 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29310 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
29320 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
29330 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
29340 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
29350 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
29360 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
29370 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
29380 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
29390 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
293a0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
293b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
293c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
293d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
293e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
293f0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
29400 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
29410 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
29420 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
29430 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
29440 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
29450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
29460 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
29470 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
29480 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
29490 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
294a0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
294b0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
294e0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
294f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
29500 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
29510 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
29520 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29530 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29560 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29570 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
29580 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
29590 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
295a0 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
295b0 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
295c0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
295d0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
295e0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
295f0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
29600 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
29610 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
29620 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
29630 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
29640 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29650 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
29660 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29670 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29680 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
29690 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
296a0 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
296b0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
296c0 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
296d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
296e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
296f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
29700 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
29710 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
29720 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
29730 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
29740 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
29750 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
29760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
29770 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
29780 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
29790 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
297a0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
297b0 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
297c0 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
297d0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
297e0 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
297f0 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
29800 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
29810 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
29820 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
29830 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
29840 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
29850 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
29860 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
29870 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
29880 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
29890 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
298a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
298b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
298c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
298d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
298e0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
298f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
29900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29910 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
29920 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29930 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
29940 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
29950 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29960 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
29970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29980 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29990 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
299a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
299b0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
299c0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
299d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
299e0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
299f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29a00 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29a10 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
29a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
29a30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
29a40 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
29a50 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
29a60 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
29a70 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
29a80 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
29a90 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
29aa0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
29ab0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29ac0 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
29ad0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29af0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
29b00 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
29b10 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
29b20 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
29b30 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
29b40 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
29b50 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
29b60 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
29b70 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
29b80 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
29b90 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
29ba0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
29bb0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
29bc0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
29bd0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
29be0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
29bf0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
29c00 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
29c10 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
29c20 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
29c30 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
29c40 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
29c50 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
29c60 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
29c70 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
29c80 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
29c90 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
29ca0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
29cb0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
29cc0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
29cd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29ce0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
29cf0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
29d00 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
29d10 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
29d20 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
29d30 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
29d40 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
29d50 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
29d60 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
29d70 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
29d80 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
29d90 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
29da0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
29db0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29dc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
29dd0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
29de0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
29df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
29e00 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
29e10 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
29e20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
29e30 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
29e40 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
29e50 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
29e60 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
29e70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
29e80 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
29e90 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
29ea0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29eb0 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
29ec0 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
29ed0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29ee0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
29ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f00 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
29f10 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
29f20 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
29f30 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
29f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
29f50 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
29f60 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
29f70 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
29f80 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
29f90 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
29fa0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
29fb0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
29fc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
29fd0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
29fe0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
29ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a000 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2a010 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2a020 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2a030 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2a040 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2a050 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2a060 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
2a070 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2a080 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a090 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2a0a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2a0b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2a0c0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2a0d0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2a0e0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2a0f0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2a100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a110 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2a120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2a130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a140 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2a150 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2a160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a170 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2a180 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2a190 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2a1a0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2a1b0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2a1c0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2a1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a1e0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2a1f0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2a200 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2a210 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2a220 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2a230 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2a240 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
2a250 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2a260 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2a270 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2a280 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2a290 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2a2a0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2a2b0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2a2c0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2a2d0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2a2e0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2a2f0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2a300 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2a310 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2a320 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2a330 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2a340 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2a350 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2a360 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2a370 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2a380 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2a390 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2a3a0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2a3b0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2a3c0 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2a3d0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2a3e0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2a3f0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2a400 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2a410 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2a420 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2a430 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2a440 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2a450 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2a460 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2a470 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2a480 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2a490 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2a4a0 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2a4b0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2a4c0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2a4d0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2a4e0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2a4f0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2a500 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2a510 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2a520 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2a530 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2a540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2a550 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2a560 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2a570 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2a580 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2a590 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2a5a0 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2a5b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2a5c0 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2a5d0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2a5e0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2a5f0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2a600 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2a610 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2a620 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2a630 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2a640 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2a650 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2a660 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2a670 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2a680 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2a690 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2a6a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2a6b0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2a6c0 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2a6d0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2a6e0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2a6f0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2a700 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2a710 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2a720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a730 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2a740 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2a750 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2a760 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2a770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2a780 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2a790 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2a7a0 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2a7b0 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2a7c0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2a7d0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2a7e0 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2a7f0 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2a800 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2a810 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2a820 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2a830 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2a840 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2a850 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2a860 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2a870 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2a880 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2a890 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2a8a0 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2a8b0 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2a8c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2a8d0 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2a8e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2a8f0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2a900 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2a910 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2a920 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2a930 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2a940 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2a950 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2a960 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2a970 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2a980 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2a990 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2a9a0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2a9b0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2a9c0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2a9d0 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2a9e0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2a9f0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2aa00 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2aa10 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2aa20 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2aa30 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2aa40 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2aa50 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2aa60 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2aa70 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2aa80 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2aa90 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2aaa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2aab0 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2aac0 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2aad0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2aae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2aaf0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2ab00 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2ab10 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2ab20 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2ab30 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ab50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ab60 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2ab70 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2ab80 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2ab90 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2aba0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2abb0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2abc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2abd0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2abe0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2abf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ac00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2ac10 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2ac20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac30 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2ac40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2ac50 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2ac60 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2ac70 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2ac80 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2ac90 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2aca0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2acb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2acc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2acd0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2ace0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2acf0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2ad00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ad10 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2ad20 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2ad30 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2ad40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ad50 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2ad60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ad70 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2ad80 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2ad90 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2ada0 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2adb0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2adc0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2add0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2ade0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2adf0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2ae00 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2ae10 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2ae20 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2ae30 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2ae40 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2ae50 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2ae60 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2ae70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ae80 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2ae90 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2aea0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2aeb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2aec0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2aed0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2aee0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2aef0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2af00 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2af10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2af20 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2af30 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2af40 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2af50 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2af60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2af70 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2af80 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2af90 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2afa0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2afb0 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2afc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2afd0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2afe0 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2aff0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2b000 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2b010 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2b020 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2b030 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b040 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b050 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b060 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2b070 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2b080 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2b090 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b0a0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2b0b0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2b0c0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2b0d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2b0e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b0f0 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2b100 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2b110 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2b120 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2b130 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2b140 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2b150 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2b160 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2b170 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2b180 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2b190 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2b1a0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2b1b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b1c0 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2b1d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2b1e0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2b1f0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2b200 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2b210 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2b220 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2b230 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2b240 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2b250 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2b260 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
2b270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2b280 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2b290 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2b2a0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2b2b0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2b2c0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2b2d0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2b2e0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2b2f0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2b300 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2b310 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2b320 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2b330 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2b340 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2b350 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2b360 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2b370 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2b380 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2b390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b3a0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2b3b0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2b3c0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2b3d0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2b3e0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2b3f0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2b400 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2b410 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2b420 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2b430 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2b440 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2b450 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2b460 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2b470 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2b480 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2b490 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2b4a0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2b4b0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2b4c0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2b4d0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2b4e0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2b4f0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2b500 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2b510 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2b520 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2b530 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2b540 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2b550 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2b560 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2b570 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2b580 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2b590 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2b5a0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2b5b0 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2b5c0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2b5d0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2b5e0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2b5f0 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2b600 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2b610 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2b620 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2b630 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2b640 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2b650 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2b660 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2b670 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2b680 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2b690 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2b6a0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2b6b0 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2b6c0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2b6d0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2b6e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2b6f0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2b700 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2b710 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2b720 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2b730 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2b740 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2b750 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2b760 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2b770 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2b780 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2b790 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2b7a0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2b7b0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2b7c0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2b7d0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2b7e0 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2b7f0 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2b800 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2b810 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2b820 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2b830 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2b840 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2b850 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2b860 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2b870 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2b880 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2b890 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2b8a0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2b8b0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2b8c0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2b8d0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2b8e0 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2b8f0 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2b900 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2b910 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2b920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b930 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2b940 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2b950 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b960 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b970 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b980 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b990 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b9a0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2b9b0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b9c0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
2b9d0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
2b9e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2b9f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2ba00 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2ba10 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ba20 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2ba30 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2ba40 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2ba50 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2ba60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ba70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2ba80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2ba90 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2baa0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2bab0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2bac0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2bad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2bae0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2baf0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2bb00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2bb10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2bb20 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2bb30 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2bb40 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2bb50 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2bb60 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2bb70 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2bb80 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2bb90 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2bba0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2bbb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2bbd0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2bbe0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2bbf0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2bc00 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2bc10 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2bc20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2bc30 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2bc40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2bc50 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2bc60 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2bc70 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2bc80 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2bc90 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2bca0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2bcb0 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2bcc0 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2bcd0 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2bce0 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2bcf0 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2bd00 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2bd10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2bd20 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2bd30 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2bd40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2bd50 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2bd60 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2bd70 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2bd80 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2bd90 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2bda0 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2bdb0 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2bdc0 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2bdd0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2bde0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2bdf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2be00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2be10 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2be20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2be30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2be40 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2be50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2be60 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2be70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2be80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2be90 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2bea0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2beb0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2bec0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2bed0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2bee0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2bef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bf00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2bf10 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2bf20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2bf30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2bf40 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2bf50 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
2bf60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2bf70 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2bf80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2bf90 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2bfa0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2bfb0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2bfc0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2bfd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2bfe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2bff0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2c000 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2c010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c020 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2c030 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2c040 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2c050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2c060 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2c070 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2c080 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2c090 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c0a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2c0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c0c0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2c0d0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2c0e0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2c0f0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2c100 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2c110 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2c120 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2c130 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c140 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2c150 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2c160 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2c170 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
2c180 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2c190 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2c1a0 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
2c1b0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2c1c0 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
2c1d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c1e0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2c1f0 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
2c200 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
2c210 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2c220 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c230 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2c240 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2c250 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2c260 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2c270 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2c280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2c2a0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2c2b0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
2c2c0 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
2c2d0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
2c2e0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
2c2f0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
2c300 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2c310 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2c320 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2c330 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2c340 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2c350 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
2c360 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2c370 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2c380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2c390 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2c3a0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2c3b0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2c3c0 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2c3d0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2c3e0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2c3f0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2c400 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2c410 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2c420 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2c430 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2c440 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2c450 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2c460 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2c470 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2c480 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2c490 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2c4a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2c4b0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2c4c0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2c4d0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2c4e0 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2c4f0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2c500 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2c510 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2c520 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2c530 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2c540 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2c550 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2c560 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2c570 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2c580 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2c590 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2c5a0 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2c5b0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2c5c0 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2c5d0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2c5e0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2c5f0 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2c600 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2c610 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2c620 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2c630 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2c640 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2c650 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2c660 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2c670 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2c680 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2c690 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2c6a0 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2c6b0 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2c6c0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2c6d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2c6e0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2c6f0 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2c700 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2c710 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2c720 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2c730 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2c740 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
2c750 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2c760 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c770 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2c780 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2c790 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2c7a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2c7b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2c7c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2c7d0 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2c7e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2c7f0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2c800 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c810 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2c820 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2c830 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2c840 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2c850 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2c860 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2c870 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2c880 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2c890 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2c8a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2c8b0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2c8c0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2c8d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c8f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c900 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2c910 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2c920 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2c930 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2c940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c950 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2c960 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2c970 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2c980 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c990 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2c9a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c9b0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2c9c0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2c9d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2c9e0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2c9f0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2ca00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2ca10 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2ca20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2ca30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2ca40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2ca50 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2ca60 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2ca70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ca80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2ca90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2caa0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2cab0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2cac0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2cad0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2cae0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2caf0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2cb00 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2cb10 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2cb20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2cb30 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2cb40 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2cb50 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2cb60 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2cb70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2cb80 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2cb90 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2cba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2cbb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2cbc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2cbd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2cbe0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2cbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2cc00 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2cc10 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2cc20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2cc30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2cc40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2cc50 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2cc60 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2cc70 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2cc80 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2cc90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2cca0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2ccb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ccc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ccd0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2cce0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2ccf0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2cd00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2cd10 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2cd20 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2cd30 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2cd40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2cd50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2cd60 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2cd70 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2cd80 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2cd90 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2cda0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2cdb0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2cdc0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2cdd0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2cde0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2cdf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ce00 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2ce10 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2ce20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2ce30 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2ce40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2ce50 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2ce60 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2ce70 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2ce80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2ce90 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2cea0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ceb0 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2cec0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ced0 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2cee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2cef0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2cf00 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2cf10 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2cf20 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2cf30 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2cf40 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2cf50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cf60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2cf70 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2cf80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2cf90 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2cfa0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2cfb0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2cfc0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2cfd0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2cfe0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2cff0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2d000 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2d010 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2d020 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2d030 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2d040 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2d050 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2d060 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2d070 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2d080 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2d090 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2d0a0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2d0b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d0c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2d0d0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2d0e0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2d0f0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2d100 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2d110 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2d120 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2d130 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2d140 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2d150 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2d160 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2d170 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2d180 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2d190 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2d1a0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2d1b0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2d1c0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2d1d0 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2d1e0 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2d1f0 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2d200 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2d210 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2d220 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2d230 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2d240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2d250 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2d260 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2d270 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2d280 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2d290 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2d2a0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2d2b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2d2c0 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2d2d0 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2d2e0 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2d2f0 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2d300 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2d310 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2d320 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2d330 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2d340 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2d350 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2d360 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2d370 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2d380 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2d390 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2d3a0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2d3b0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2d3c0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2d3d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2d3e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2d3f0 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2d400 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2d410 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2d420 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2d430 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2d440 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2d450 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2d460 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2d470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2d480 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2d490 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2d4a0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2d4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2d4c0 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2d4d0 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2d4e0 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2d4f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2d500 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2d510 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2d520 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2d530 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2d540 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2d550 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2d560 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2d570 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2d580 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2d590 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2d5a0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2d5b0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
2d5c0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2d5d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d5e0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
2d5f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d600 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2d610 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2d620 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
2d630 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
2d640 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
2d650 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
2d660 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
2d670 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
2d680 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
2d690 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
2d6a0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2d6b0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
2d6c0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2d6d0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2d6e0 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
2d6f0 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
2d700 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2d710 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2d720 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
2d730 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2d740 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
2d750 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
2d760 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
2d770 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
2d780 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d790 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
2d7a0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
2d7b0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
2d7c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2d7d0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
2d7e0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
2d7f0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
2d800 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
2d810 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
2d820 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
2d830 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2d840 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
2d850 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64   .    /* If eMod
2d860 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2d870 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
2d880 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2d890 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
2d8a0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
2d8b0 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
2d8c0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2d8d0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
2d8e0 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
2d8f0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
2d900 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
2d910 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
2d920 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d930 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f  CUUM.    if( eMo
2d940 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2d950 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  T ){.      if( n
2d960 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
2d970 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2d980 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
2d990 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
2d9a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d9b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2d9c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
2d9d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
2d9e0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
2d9f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2da00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2da10 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
2da20 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2da30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65   ){.          se
2da40 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2da50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2da60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
2da70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2da80 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
2da90 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ist = 1;.    }.#
2daa0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
2dab0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2dac0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
2dad0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
2dae0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2daf0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
2db00 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
2db10 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
2db20 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
2db30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2db40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2db50 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2db60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2db70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
2db80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2db90 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
2dba0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
2dbb0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
2dbc0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
2dbd0 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
2dbe0 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
2dbf0 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
2dc00 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
2dc10 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
2dc20 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
2dc30 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
2dc40 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
2dc50 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2dc60 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2dc70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2dc80 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e  CT).    ** or un
2dc90 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20  til a page less 
2dca0 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73  than 'nearby' is
2dcb0 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2dcc0 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20  =BTALLOC_LT).   
2dcd0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
2dce0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2dcf0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
2dd00 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
2dd10 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2dd20 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d  NCE-OF: R-01506-
2dd30 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20  11053 The first 
2dd40 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65  integer on a fre
2dd50 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2dd60 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74  .        ** is t
2dd70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2dd80 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c  f the next freel
2dd90 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  ist trunk page i
2dda0 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20  n the list or.  
2ddb0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66        ** zero if
2ddc0 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73   this is the las
2ddd0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2dde0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
2ddf0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2de00 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2de10 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
2de20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2de30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2de40 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54   R-59841-13798 T
2de50 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
2de60 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
2de70 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20  offset 32.      
2de80 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
2de90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2dea0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2deb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f   the freelist, o
2dec0 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20  r zero if.      
2ded0 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
2dee0 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20  t is empty. */. 
2def0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2df00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2df10 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2df20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
2df30 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78  case( iTrunk==mx
2df40 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Page );.      if
2df50 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
2df60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2df70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2df80 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2df90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2dfa0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2dfb0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2dfc0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2dfd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2dfe0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2dff0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2e000 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2e010 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2e020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2e030 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2e040 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2e050 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2e060 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2e070 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2e080 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2e090 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2e0a0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2e0b0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2e0c0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2e0d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2e0e0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2e0f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2e100 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2e110 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2e120 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2e130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2e140 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2e150 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2e160 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2e170 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2e180 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2e190 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2e1a0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2e1b0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2e1c0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2e1d0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2e1e0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2e1f0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2e200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e210 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2e220 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e230 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e240 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e250 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e270 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2e280 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2e290 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2e2a0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2e2b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2e2c0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2e2d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2e2e0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2e2f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2e300 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2e310 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2e320 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2e330 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2e340 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2e350 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2e360 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2e370 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2e380 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2e390 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2e3a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2e3b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2e3c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2e3d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2e3e0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2e3f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e400 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2e410 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2e420 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2e430 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2e440 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2e450 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2e460 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2e470 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2e480 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2e490 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2e4a0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2e4b0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2e4c0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2e4d0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2e4e0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2e4f0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2e500 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2e510 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2e520 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2e530 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2e540 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2e550 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2e560 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2e570 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2e580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2e590 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2e5a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2e5b0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2e5c0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2e5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2e5e0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2e5f0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2e600 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2e610 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2e620 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2e630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2e650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e660 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2e670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e680 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e6a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2e6b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2e6c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e6d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2e6e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2e6f0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2e700 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2e710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e730 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2e740 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2e750 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2e760 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2e770 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2e780 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2e790 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2e7a0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2e7b0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2e7c0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2e7d0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2e7e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2e7f0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2e800 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2e810 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2e820 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2e830 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2e840 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2e850 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2e860 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e870 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e880 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2e890 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2e8a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2e8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2e8c0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2e8d0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2e8e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2e8f0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2e900 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2e910 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2e920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e940 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e950 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2e960 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2e970 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2e980 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e990 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2e9a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2e9b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e9d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2e9e0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2e9f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2ea00 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2ea10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2ea30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2ea40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2ea50 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2ea60 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2ea70 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2ea80 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2ea90 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2eaa0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2eab0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2eac0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2ead0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2eae0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2eaf0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2eb00 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2eb10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2eb20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2eb30 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2eb40 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2eb50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2eb60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2eb70 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2eb80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2eb90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2eba0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ebb0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2ebc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2ebd0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ebf0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ec00 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2ec10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2ec20 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2ec30 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2ec40 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2ec50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ec60 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2ec70 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2ec80 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2ec90 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2eca0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2ecb0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2ecc0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2ecd0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2ece0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2ecf0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2ed00 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2ed10 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2ed20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2ed30 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2ed40 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2ed50 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2ed60 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2ed70 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2ed80 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2ed90 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2eda0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2edb0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2edc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2edd0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2ede0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2edf0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2ee00 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2ee10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ee20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2ee30 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2ee40 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2ee50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ee60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ee70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ee80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ee90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2eea0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2eeb0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2eec0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2eed0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2eee0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2ef00 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2ef20 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2ef30 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2ef40 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2ef50 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2ef60 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2ef70 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2ef80 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2ef90 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2efa0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2efc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2efd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2efe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2eff0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2f000 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2f010 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2f020 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2f030 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2f040 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2f050 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f060 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2f070 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2f080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2f090 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f0a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f0b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f0d0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2f0e0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2f0f0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2f100 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2f110 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2f120 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2f130 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2f140 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2f150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2f160 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2f170 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2f180 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2f190 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2f1a0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2f1b0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2f1c0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2f1d0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2f1e0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f200 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2f210 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2f220 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f240 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2f250 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f260 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2f270 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f280 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f290 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2f2a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2f2b0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2f2c0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2f2d0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2f2e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f2f0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2f300 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2f310 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2f320 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2f330 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2f340 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
2f350 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2f360 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2f370 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2f380 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2f390 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
2f3a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
2f3b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f3e0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2f3f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f400 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2f410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f420 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2f430 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2f440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
2f450 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
2f460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f480 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2f490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f4a0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
2f4b0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2f4c0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2f4d0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2f4e0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
2f4f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2f500 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
2f510 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2f520 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
2f530 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2f540 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2f550 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
2f560 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
2f570 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
2f580 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
2f590 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
2f5a0 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
2f5b0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
2f5c0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
2f5d0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
2f5e0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
2f5f0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
2f600 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
2f610 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
2f620 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
2f630 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
2f640 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
2f650 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
2f660 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
2f670 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
2f680 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
2f690 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
2f6a0 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
2f6b0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
2f6c0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
2f6d0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
2f6e0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
2f6f0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
2f700 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
2f710 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
2f720 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
2f730 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
2f740 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
2f750 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
2f760 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
2f770 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
2f780 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
2f790 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
2f7a0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2f7b0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
2f7c0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
2f7d0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
2f7e0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
2f7f0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
2f800 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
2f810 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
2f820 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2f830 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2f840 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
2f850 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
2f860 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
2f870 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
2f880 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
2f890 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
2f8a0 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
2f8b0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
2f8c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
2f8d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2f8e0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
2f8f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f900 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2f910 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
2f920 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
2f930 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
2f940 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
2f950 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
2f960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f970 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2f980 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2f990 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2f9a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2f9b0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2f9c0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2f9d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2f9e0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2f9f0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2fa00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fa10 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2fa20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2fa30 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2fa40 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
2fa50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
2fa60 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
2fa70 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2fa80 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
2fa90 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
2faa0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
2fab0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
2fac0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
2fad0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
2fae0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
2faf0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
2fb00 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
2fb10 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
2fb20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
2fb30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
2fb40 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
2fb50 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2fb60 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2fb70 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
2fb80 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
2fb90 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
2fba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fbb0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
2fbc0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2fbd0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2fbe0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
2fbf0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
2fc00 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
2fc10 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
2fc20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fc30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2fc40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fc50 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
2fc60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2fc70 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
2fc80 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2fc90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fca0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2fcb0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
2fcc0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2fcd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
2fce0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
2fcf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2fd00 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
2fd10 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
2fd20 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
2fd30 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
2fd40 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
2fd50 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
2fd60 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
2fd70 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
2fd80 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
2fd90 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
2fda0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
2fdb0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
2fdc0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fdd0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2fde0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2fdf0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2fe00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2fe10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2fe30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
2fe40 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
2fe50 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
2fe60 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2fe70 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
2fe80 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
2fe90 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2fea0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2feb0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
2fec0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
2fed0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2fee0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
2fef0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2ff00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2ff10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
2ff20 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2ff30 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
2ff40 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
2ff50 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2ff60 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
2ff70 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
2ff80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ff90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ffa0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2ffb0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
2ffc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2ffd0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
2ffe0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
2fff0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
30000 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
30010 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
30020 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
30030 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
30040 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
30050 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30060 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
30070 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
30080 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
30090 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
300a0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
300b0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
300c0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
300d0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
300e0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
300f0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
30100 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
30110 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
30120 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
30130 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
30140 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
30150 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
30160 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
30170 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
30180 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
30190 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
301a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
301b0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
301c0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
301d0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
301e0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
301f0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30210 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
30220 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
30230 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
30240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30250 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
30260 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
30270 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
30280 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
30290 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
302a0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
302b0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
302c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
302d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
302e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
302f0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
30300 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
30310 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30330 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
30340 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
30350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30360 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
30370 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
30380 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
30390 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
303a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
303b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
303c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
303d0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
303e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
303f0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
30400 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
30410 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
30420 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
30430 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30440 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
30450 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
30460 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
30470 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
30480 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
30490 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
304a0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
304b0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
304c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
304d0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
304e0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
304f0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
30500 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30510 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
30520 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30530 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
30540 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
30550 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30560 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
30570 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30580 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
30590 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
305a0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
305b0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
305c0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
305d0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
305e0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
305f0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
30600 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
30610 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
30620 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
30630 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
30640 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
30650 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
30660 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
30670 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
30680 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
30690 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
306a0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
306b0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
306c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
306d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
306e0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
306f0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
30700 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
30710 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
30720 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
30730 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
30740 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
30750 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
30760 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
30770 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
30780 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
30790 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
307a0 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
307b0 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
307c0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
307d0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
307e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
307f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
30800 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
30810 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
30820 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
30830 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
30840 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
30850 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
30860 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
30870 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
30880 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
30890 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
308a0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
308b0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
308c0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
308d0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
308e0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
308f0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
30900 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
30910 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
30920 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
30930 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
30940 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
30950 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
30960 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
30970 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
30980 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
30990 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
309a0 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
309b0 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
309c0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
309d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
309e0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
309f0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
30a00 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
30a10 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
30a20 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30a30 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
30a40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
30a50 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
30a60 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
30a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30a80 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
30a90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
30aa0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
30ab0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30ac0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
30ad0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
30ae0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
30af0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
30b00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
30b10 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
30b20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30b30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
30b40 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
30b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
30b60 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
30b70 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
30b80 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
30b90 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
30ba0 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
30bb0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
30bc0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
30bd0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
30be0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
30bf0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
30c00 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
30c10 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
30c20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
30c30 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
30c40 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
30c50 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
30c60 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
30c70 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
30c80 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
30c90 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
30ca0 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
30cb0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
30cc0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
30cd0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
30ce0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
30cf0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
30d00 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
30d10 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
30d20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
30d30 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
30d40 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
30d50 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
30d60 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
30d70 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
30d80 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
30d90 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
30da0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
30db0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
30dc0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
30dd0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
30de0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
30df0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
30e00 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
30e10 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
30e20 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
30e30 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
30e40 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
30e50 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
30e60 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
30e70 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
30e80 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
30e90 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
30ea0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
30eb0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
30ec0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
30ed0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
30ee0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
30ef0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
30f00 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
30f10 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
30f20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
30f30 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
30f40 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
30f50 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
30f60 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
30f70 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
30f80 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
30f90 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
30fa0 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
30fb0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
30fc0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
30fd0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
30fe0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30ff0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
31000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31010 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
31020 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
31050 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
31060 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
31070 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
31080 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31090 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
310a0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
310b0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
310c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
310d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
310e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
310f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
31100 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
31110 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
31120 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
31130 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
31140 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
31150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
31160 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
31170 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
31180 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
31190 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
311a0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
311b0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
311c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
311d0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
311e0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
311f0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
31200 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
31210 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
31220 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
31230 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
31240 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
31250 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
31260 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
31270 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
31280 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
31290 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
312a0 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
312b0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
312c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
312d0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
312e0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
312f0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
31300 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
31310 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
31320 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31330 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
31340 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
31350 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
31360 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31370 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
31380 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
31390 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
313a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
313b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
313c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
313d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
313e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
313f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
31400 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
31410 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
31420 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
31430 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
31440 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
31450 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
31460 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
31470 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
31480 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
31490 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
314a0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
314b0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
314c0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
314d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
314e0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
314f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31500 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
31510 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
31520 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
31530 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
31540 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
31550 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
31560 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
31570 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
31580 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
31590 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
315a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
315b0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
315c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
315d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
315e0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
315f0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
31600 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
31610 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
31620 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
31630 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
31640 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
31650 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
31660 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
31670 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
31680 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
31690 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
316a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
316b0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
316c0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
316d0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
316e0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
316f0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
31700 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
31710 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
31720 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
31730 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31740 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
31750 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31760 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
31770 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
31780 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
31790 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
317a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
317b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
317c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
317d0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
317e0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
317f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
31800 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
31810 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
31820 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
31830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31840 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
31850 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
31860 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
31870 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
31880 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
31890 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
318a0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
318b0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
318c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
318d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
318e0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
318f0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
31900 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
31910 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
31920 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
31930 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
31940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
31950 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
31960 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
31970 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
31980 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
31990 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
319a0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
319b0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
319c0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
319d0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
319e0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
319f0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20  info.nPayload + 
31a00 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
31a10 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
31a20 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
31a30 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
31a40 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
31a50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
31a60 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
31a70 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
31a80 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
31a90 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
31aa0 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
31ab0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
31ac0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
31ad0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
31ae0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
31af0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
31b00 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
31b10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
31b20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
31b30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
31b40 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
31b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31b60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31b70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
31b80 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
31b90 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
31ba0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
31bb0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
31bc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31bd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
31be0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
31bf0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
31c00 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
31c10 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
31c20 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
31c30 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
31c40 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
31c50 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
31c60 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
31c70 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
31c80 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
31c90 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
31ca0 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
31cb0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
31cc0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
31cd0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
31ce0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
31cf0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
31d00 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
31d10 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
31d20 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
31d30 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
31d40 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
31d50 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
31d60 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
31d70 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
31d80 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
31d90 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
31da0 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
31db0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
31dc0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
31dd0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
31de0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
31df0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
31e00 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
31e10 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
31e20 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
31e30 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
31e40 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
31e50 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
31e60 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
31e70 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
31e80 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
31e90 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
31ea0 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
31eb0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
31ec0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
31ed0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31ef0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
31f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
31f10 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
31f20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
31f30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
31f40 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
31f50 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31f60 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
31f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
31f80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31f90 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
31fa0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
31fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31fc0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
31fd0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
31fe0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
31ff0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
32000 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
32010 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
32020 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
32030 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
32040 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
32050 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
32060 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
32070 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
32080 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
32090 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
320a0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
320b0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
320c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
320d0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
320e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
320f0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
32100 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
32110 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
32120 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
32130 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
32140 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
32150 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
32160 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
32170 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
32180 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
32190 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
321a0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
321b0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
321c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
321d0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
321e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32200 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
32210 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
32220 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
32230 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
32240 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
32250 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
32260 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
32270 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
32280 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
32290 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
322a0 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
322b0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
322c0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322e0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
322f0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
32300 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
32310 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
32320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32330 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
32340 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
32350 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
32360 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
32370 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
32380 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
32390 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
323a0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
323b0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
323c0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
323d0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
323e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
323f0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
32400 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
32410 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
32420 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
32430 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
32440 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32450 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
32460 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
32470 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
32480 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
32490 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
324a0 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
324b0 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
324c0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
324d0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
324e0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
324f0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
32500 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
32510 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
32520 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
32530 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
32540 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
32550 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32560 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32570 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
32580 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
32590 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
325a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
325b0 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  e;.  nPayload = 
325c0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
325d0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
325e0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  eyLeaf ){.    nH
325f0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
32600 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
32610 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
32620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
32630 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29  sert( nData==0 )
32640 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a  ;.    assert( nZ
32650 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ero==0 );.  }.  
32660 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
32670 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
32680 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
32690 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ey);.  .  /* Fil
326a0 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
326b0 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70   size */.  if( p
326c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
326d0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
326e0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
326f0 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
32700 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
32710 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e   if( NEVER(nKey>
32720 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
32730 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ey==0) ){.      
32740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
32750 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32760 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  }.    nPayload =
32770 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
32780 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
32790 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
327a0 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  y;.  }.  if( nPa
327b0 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
327c0 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20  xLocal ){.    n 
327d0 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
327e0 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
327f0 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
32800 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
32810 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
32820 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
32830 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  ze = n;.    spac
32840 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64  eLeft = nPayload
32850 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
32860 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cell;.  }else{. 
32870 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67     int mn = pPag
32880 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
32890 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
328a0 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
328b0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
328c0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
328d0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
328e0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
328f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
32900 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
32910 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20   );.    if( n > 
32920 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
32930 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70  ) n = mn;.    sp
32940 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20  aceLeft = n;.   
32950 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
32960 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20  Header + 4;.    
32970 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
32980 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a  nHeader+n];.  }.
32990 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
329a0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20  ell[nHeader];.. 
329b0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
329c0 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
329d0 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
329e0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
329f0 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
32a00 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
32a10 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
32a20 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
32a30 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
32a40 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
32a50 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
32a60 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
32a70 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
32a80 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
32a90 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
32aa0 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
32ac0 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
32ad0 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
32ae0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
32af0 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
32b00 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
32b10 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
32b20 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
32b30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
32b40 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
32b50 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
32b60 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
32b70 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
32b80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
32b90 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
32ba0 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
32bb0 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
32bc0 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
32bd0 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
32be0 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
32bf0 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
32c00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
32c10 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
32c20 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
32c30 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
32c40 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
32c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
32c60 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  ader=(int)(info.
32c70 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
32c80 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
32c90 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
32ca0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32cb0 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
32cc0 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
32cd0 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
32ce0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
32cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
32d00 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e  ior == &pCell[in
32d10 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b  fo.iOverflow] );
32d20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
32d30 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
32d40 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
32d50 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
32d60 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
32d70 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
32d80 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
32d90 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
32da0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
32db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32dc0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
32dd0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
32de0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
32df0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
32e00 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
32e10 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
32e20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32e30 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
32e40 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
32e50 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
32e60 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
32e70 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
32e80 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
32e90 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
32ea0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32eb0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
32ec0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
32ed0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
32ee0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
32ef0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
32f00 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
32f10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32f20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32f30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
32f40 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
32f50 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
32f60 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
32f70 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
32f80 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
32f90 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
32fa0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
32fb0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
32fc0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
32fd0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
32fe0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
32ff0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
33000 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
33010 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
33020 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
33030 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
33040 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
33050 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
33060 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
33070 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
33080 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
33090 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
330a0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
330b0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
330c0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
330d0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
330e0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
330f0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
33100 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
33110 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
33120 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33150 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
33160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33170 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
33180 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
33190 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
331a0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
331b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
331c0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
331d0 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
331e0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
331f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
33200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
33210 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
33220 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33230 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33240 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33250 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
33260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
33270 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
33280 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
33290 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
332a0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
332b0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
332c0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
332d0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
332e0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
332f0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
33300 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
33310 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
33320 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
33330 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33340 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
33350 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
33360 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
33370 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
33380 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
33390 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
333a0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
333b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
333c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
333d0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
333e0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
333f0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
33400 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
33410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
33420 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33430 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
33440 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
33450 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
33460 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
33470 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
33480 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
33490 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
334a0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
334b0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
334c0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
334d0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
334e0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
334f0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
33500 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
33510 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
33520 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
33530 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
33540 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
33550 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
33560 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
33570 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
33580 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
33590 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
335a0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
335b0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
335c0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
335d0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
335e0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
335f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
33600 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
33610 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33620 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
33630 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33640 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
33650 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
33660 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
33670 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
33680 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
33690 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
336a0 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
336b0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
336c0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
336d0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
336e0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
336f0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
33700 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33710 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33720 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
33730 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
33740 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
33750 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
33760 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
33770 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
33780 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
33790 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
337a0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
337b0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
337c0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
337d0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
337e0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
337f0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
33800 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
33810 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
33820 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
33830 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
33840 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
33850 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
33860 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
33870 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
33880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
33890 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
338a0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
338b0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
338c0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
338d0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
338e0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
338f0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
33900 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
33910 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
33920 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
33930 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
33940 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
33950 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
33960 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
33970 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
33980 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
33990 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
339a0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
339b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
339c0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
339d0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
339e0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
339f0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
33a00 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
33a10 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
33a20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
33a30 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
33a40 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
33a50 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
33a60 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
33a70 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
33a80 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
33a90 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
33aa0 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
33ab0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
33ac0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
33ad0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
33ae0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
33af0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
33b00 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
33b10 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
33b20 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
33b30 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
33b40 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
33b50 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
33b60 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
33b70 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
33b80 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
33b90 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
33ba0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33bb0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
33bc0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33bd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
33be0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33bf0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33c00 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
33c10 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
33c20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
33c30 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
33c40 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
33c50 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
33c60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
33c70 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
33c80 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
33c90 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
33ca0 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
33cb0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33cc0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
33cd0 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
33ce0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
33cf0 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
33d00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33d10 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
33d20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33d30 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
33d40 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
33d50 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
33d60 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
33d70 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
33d80 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
33d90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
33da0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
33db0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
33dc0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
33dd0 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
33de0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
33df0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
33e00 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
33e10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
33e20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
33e30 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
33e40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
33e50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
33e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e70 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
33e80 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
33e90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
33ea0 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
33eb0 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
33ec0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
33ed0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
33ee0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
33ef0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
33f00 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
33f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
33f20 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
33f30 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
33f40 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
33f50 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
33f60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
33f70 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
33f80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
33f90 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
33fa0 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
33fb0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
33fc0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
33fd0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
33fe0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
33ff0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
34000 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
34010 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
34020 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
34030 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
34040 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
34050 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
34060 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
34070 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
34080 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
34090 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
340a0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
340b0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
340c0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
340d0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
340e0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
340f0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
34100 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
34110 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
34120 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
34130 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
34140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34150 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
34160 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
34170 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
34180 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
34190 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
341a0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
341b0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
341c0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
341d0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
341e0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
341f0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
34200 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
34210 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
34220 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
34230 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
34240 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
34250 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
34260 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
34270 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
34280 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
34290 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
342a0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
342b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
342c0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
342d0 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
342e0 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
342f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
34300 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
34310 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
34320 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
34330 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
34340 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34350 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
34360 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
34370 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
34380 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
34390 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
343a0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
343b0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
343c0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
343d0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
343e0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
343f0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
34400 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
34410 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
34420 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
34430 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
34440 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
34450 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
34460 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
34470 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
34480 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
34490 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
344a0 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
344b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
344c0 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
344d0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
344e0 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
344f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
34500 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
34510 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
34520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34530 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
34540 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
34550 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
34560 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
34570 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
34580 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
34590 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
345a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
345b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
345c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
345d0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
345e0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
345f0 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
34600 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
34610 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
34620 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
34630 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
34640 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
34650 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
34660 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
34670 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
34680 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
34690 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
346a0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
346b0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
346c0 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
346d0 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
346e0 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
346f0 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
34700 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
34710 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
34720 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
34730 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
34740 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c  sz==pPage->xCell
34750 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c  Size(pPage, pCel
34760 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
34770 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
34780 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
34790 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
347a0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
347b0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
347c0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
347d0 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
347e0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
347f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34800 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
34810 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
34820 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
34830 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
34840 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
34850 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
34860 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
34870 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
34880 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
34890 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
348a0 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
348b0 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
348c0 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20  l[j] = (u16)i;. 
348d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
348e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
348f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34900 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
34910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34920 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
34930 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
34940 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
34950 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34960 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34970 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
34980 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
34990 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
349a0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
349b0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
349c0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
349d0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
349e0 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
349f0 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
34a00 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
34a10 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
34a20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
34a30 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
34a40 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
34a50 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
34a60 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
34a70 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
34a80 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a  wing properties.
34a90 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
34aa0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
34ab0 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
34ac0 20 69 64 78 20 3e 3d 20 30 20 26 26 20 28 69 64   idx >= 0 && (id
34ad0 78 20 3e 3d 20 65 6e 64 2b 32 20 7c 7c 20 43 4f  x >= end+2 || CO
34ae0 52 52 55 50 54 5f 44 42 29 20 29 3b 0a 20 20 20  RRUPT_DB) );.   
34af0 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
34b00 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
34b10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
34b20 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
34b30 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
34b40 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
34b50 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
34b60 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
34b70 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
34b80 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
34b90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
34ba0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
34bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d  ;.    }.    memm
34bc0 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d  ove(&data[ins+2]
34bd0 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e  , &data[ins], en
34be0 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32  d-ins);.    put2
34bf0 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
34c00 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
34c10 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
34c20 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
34c30 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
34c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34c50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
34c60 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
34c70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
34c80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
34c90 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
34ca0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
34cb0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
34cc0 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
34cd0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
34ce0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
34cf0 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
34d00 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
34d10 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
34d20 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
34d30 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
34d40 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
34d50 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
34d60 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
34d70 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20  inters to nCell 
34d80 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c  b-tree page cell
34d90 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c  s. The .** szCel
34da0 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  l[] array contai
34db0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
34dc0 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c  ytes of each cel
34dd0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
34de0 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65  .** replaces the
34df0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
34e00 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69  s of page pPg wi
34e10 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
34e20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61  of the cell.** a
34e30 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rray..**.** Some
34e40 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
34e50 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75   apCell[] may cu
34e60 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
34e70 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a  d in pPg. This.*
34e80 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  * function works
34e90 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
34ea0 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20   caused by this 
34eb0 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  by making a copy
34ec0 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68   of any .** such
34ed0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76   cells before ov
34ee0 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  erwriting the pa
34ef0 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  ge data..**.** T
34f00 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65  he MemPage.nFree
34f10 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
34f20 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  dated by this fu
34f30 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  nction. It is th
34f40 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
34f50 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
34f60 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
34f70 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
34f80 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64 50 61  c void rebuildPa
34f90 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
34fa0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
34fb0 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
34fc0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
34fd0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34ff0 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
35000 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
35010 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
35020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35030 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
35040 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
35050 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
35060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35070 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
35080 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
35090 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
350a0 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
350b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
350c0 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
350d0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
350e0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
350f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
35100 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
35110 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
35120 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
35130 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
35140 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
35150 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
35160 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
35170 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
35180 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
35190 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
351a0 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
351b0 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
351c0 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
351d0 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
351e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
351f0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
35200 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
35210 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
35220 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
35230 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
35240 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
35250 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35260 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
35270 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61  .    if( pCell>a
35280 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45  Data && pCell<pE
35290 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c  nd ){.      pCel
352a0 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20  l = &pTmp[pCell 
352b0 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a  - aData];.    }.
352c0 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43      pData -= szC
352d0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  ell[i];.    memc
352e0 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c  py(pData, pCell,
352f0 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   szCell[i]);.   
35300 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
35310 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61  tr, (pData - aDa
35320 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
35330 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 61 73 73  tr += 2;.    ass
35340 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
35350 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
35360 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
35370 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
35380 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
35390 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]==pPg->xCellS
353a0 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
353b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
353c0 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
353d0 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
353e0 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
353f0 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
35400 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
35410 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
35420 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35430 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
35440 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
35450 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
35460 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
35470 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
35480 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
35490 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
354a0 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
354b0 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0x00;.}../*.** 
354c0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
354d0 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
354e0 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
354f0 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
35500 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  Cell.** contains
35510 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
35520 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
35530 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
35540 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
35550 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c  .** add the cell
35560 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
35570 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50  array to page pP
35580 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20  g. If it cannot 
35590 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  (because .** the
355a0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
355b0 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  e defragmented b
355c0 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20  efore the cells 
355d0 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a  will fit), non-z
355e0 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
355f0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
35600 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  f the cells are 
35610 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
35620 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72  ly, zero is.** r
35630 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
35640 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72  rgument pCellptr
35650 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
35660 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
35670 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
35680 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66  rray.** (part of
35690 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f   page pPg) to po
356a0 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65  pulate. After ce
356b0 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20  ll apCell[0] is 
356c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
356d0 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31  * page body, a 1
356e0 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20  6-bit offset is 
356f0 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c  written to pCell
35700 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20  ptr. And so on, 
35710 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c  for each.** cell
35720 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49   in the array. I
35730 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
35740 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35750 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a  aller to ensure.
35760 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61  ** that it is sa
35770 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  fe to overwrite 
35780 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
35790 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
357a0 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ray..**.** When 
357b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
357c0 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61   called, *ppData
357d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
357e0 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tart of the .** 
357f0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20  content area on 
35800 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65  page pPg. If the
35810 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e   size of the con
35820 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74  tent area is ext
35830 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74  ended,.** *ppDat
35840 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  a is updated to 
35850 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
35860 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f   start of the co
35870 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65  ntent area.** be
35880 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
35890 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61  **.** Finally, a
358a0 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70  rgument pBegin p
358b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74  oints to the byt
358c0 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
358d0 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
358e0 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20  nd of the space 
358f0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
35900 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65   page for the ce
35910 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
35920 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c  (for.** all cell
35930 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f  s - not just tho
35940 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  se inserted by t
35950 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29  he current call)
35960 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
35970 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65  .** area must be
35980 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66   extended to bef
35990 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ore this point i
359a0 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d  n order to accom
359b0 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c  odate all.** cel
359c0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20  ls in apCell[], 
359d0 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64  then the cells d
359e0 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f  o not fit and no
359f0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
35a00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
35a10 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  t pageInsertArra
35a20 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
35a30 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
35a40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
35a50 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a  add cells to */.
35a60 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20    u8 *pBegin,   
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c    /* End of cell
35a90 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a  -pointer array *
35aa0 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c  /.  u8 **ppData,
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ac0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
35ad0 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65  age content -are
35ae0 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
35af0 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20  8 *pCellptr,    
35b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35b10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
35b20 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a  l-pointer area *
35b30 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
35b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35b60 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
35b70 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61   pPg */.  u8 **a
35b80 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
35b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35ba0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
35bb0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
35bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bd0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
35be0 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35bf0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61  int i;.  u8 *aDa
35c00 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
35c10 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a  .  u8 *pData = *
35c20 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ppData;.  const 
35c30 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20  int bFreelist = 
35c40 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74  aData[1] || aDat
35c50 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  a[2];.  assert( 
35c60 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50  CORRUPT_DB || pP
35c70 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  g->hdrOffset==0 
35c80 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63  );    /* Never c
35c90 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20  alled on page 1 
35ca0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
35cb0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
35cc0 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c   int sz = szCell
35cd0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  [i];.    int rc;
35ce0 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a  .    u8 *pSlot;.
35cf0 20 20 20 20 69 66 28 20 62 46 72 65 65 6c 69 73      if( bFreelis
35d00 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  t==0 || (pSlot =
35d10 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
35d20 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29 3d  g, sz, &rc, 0))=
35d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  =0 ){.      pDat
35d40 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69  a -= sz;.      i
35d50 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
35d60 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
35d70 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b    pSlot = pData;
35d80 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
35d90 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b  y(pSlot, apCell[
35da0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74  i], sz);.    put
35db0 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
35dc0 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29  (pSlot - aData))
35dd0 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
35de0 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61  = 2;.  }.  *ppDa
35df0 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65  ta = pData;.  re
35e00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
35e10 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
35e20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
35e30 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
35e40 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
35e50 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69  zCell .** contai
35e60 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
35e70 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
35e80 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
35e90 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a  ction adds the.*
35ea0 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74  * space associat
35eb0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c  ed with each cel
35ec0 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  l in the array t
35ed0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
35ee0 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68   stored .** with
35ef0 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70  in the body of p
35f00 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72  Pg to the pPg fr
35f10 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c  ee-list. The cel
35f20 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f  l-pointers and o
35f30 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f  ther.** fields o
35f40 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e  f the page are n
35f50 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  ot updated..**.*
35f60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35f70 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
35f80 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
35f90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
35fa0 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ree-list..*/.sta
35fb0 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65  tic int pageFree
35fc0 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
35fd0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
35fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35ff0 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e   to edit */.  in
36000 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
36010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36020 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65   Cells to delete
36030 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
36040 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36050 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36060 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
36070 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36090 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
360a0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  zes */.){.  u8 *
360b0 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
360c0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
360d0 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
360e0 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e  aData[pPg->pBt->
360f0 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75  usableSize];.  u
36100 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74  8 * const pStart
36110 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68   = &aData[pPg->h
36120 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70  drOffset + 8 + p
36130 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  Pg->childPtrSize
36140 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20  ];.  int nRet = 
36150 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  0;.  int i;.  u8
36160 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69   *pFree = 0;.  i
36170 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a  nt szFree = 0;..
36180 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
36190 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
361a0 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
361b0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65  [i];.    if( pCe
361c0 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43  ll>=pStart && pC
361d0 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
361e0 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c    int sz = szCel
361f0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  l[i];.      if( 
36200 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20  pFree!=(pCell + 
36210 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  sz) ){.        i
36220 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
36230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
36240 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
36250 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
36260 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  36 );.          
36270 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28  freeSpace(pPg, (
36280 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61  u16)(pFree - aDa
36290 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20  ta), szFree);.  
362a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
362b0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
362c0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20         szFree = 
362d0 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  sz;.        if( 
362e0 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20  pFree+sz>pEnd ) 
362f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
36300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
36310 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
36320 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20        szFree += 
36330 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
36340 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a    nRet++;.    }.
36350 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20    }.  if( pFree 
36360 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36370 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
36380 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
36390 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53  536 );.    freeS
363a0 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28  pace(pPg, (u16)(
363b0 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20  pFree - aData), 
363c0 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  szFree);.  }.  r
363d0 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f  eturn nRet;.}../
363e0 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  *.** apCell[] an
363f0 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  d szCell[] conta
36400 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
36410 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  and sizes of all
36420 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a   cells in the.**
36430 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
36440 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72  anced.  The curr
36450 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68  ent page, pPg, h
36460 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65  as pPg->nCell ce
36470 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  lls starting.** 
36480 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64  with apCell[iOld
36490 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63  ].  After balanc
364a0 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73  ing, this page s
364b0 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20  hould hold nNew 
364c0 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e  cells.** startin
364d0 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77  g at apCell[iNew
364e0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ]..**.** This ro
364f0 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
36500 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
36510 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20  ments to pPg so 
36520 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
36530 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
36540 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e  cells after bein
36550 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  g balanced..**.*
36560 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
36570 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
36580 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
36590 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74  tion returns. It
365a0 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f   is the.** respo
365b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
365c0 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
365d0 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
365e0 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
365f0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
36600 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
36610 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
36620 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
36630 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
36640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36650 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
36660 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
36670 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
36680 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
36690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
366a0 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
366b0 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
366c0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366e0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
366f0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
36700 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36710 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
36720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36730 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
36740 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
36770 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
36780 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
36790 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
367a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
367b0 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
367c0 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d  ;.  u8 *pBegin =
367d0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
367e0 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74  nNew * 2];.  int
367f0 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43   nCell = pPg->nC
36800 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65  ell;       /* Ce
36810 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50  lls stored on pP
36820 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61  g */.  u8 *pData
36830 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
36840 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
36850 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20   iOldEnd = iOld 
36860 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70  + pPg->nCell + p
36870 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  Pg->nOverflow;. 
36880 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69   int iNewEnd = i
36890 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66  New + nNew;..#if
368a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
368b0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
368c0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
368d0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
368e0 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ager);.  memcpy(
368f0 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67  pTmp, aData, pPg
36900 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36910 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
36920 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72   Remove cells fr
36930 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  om the start and
36940 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
36950 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69   */.  if( iOld<i
36960 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  New ){.    int n
36970 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65  Shift = pageFree
36980 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70  Array(.        p
36990 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26  Pg, iNew-iOld, &
369a0 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73  apCell[iOld], &s
369b0 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20  zCell[iOld].    
369c0 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
369d0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70  Pg->aCellIdx, &p
369e0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68  Pg->aCellIdx[nSh
369f0 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29  ift*2], nCell*2)
36a00 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e  ;.    nCell -= n
36a10 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Shift;.  }.  if(
36a20 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45   iNewEnd < iOldE
36a30 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20  nd ){.    nCell 
36a40 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79  -= pageFreeArray
36a50 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69  (.        pPg, i
36a60 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20  OldEnd-iNewEnd, 
36a70 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d  &apCell[iNewEnd]
36a80 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e  , &szCell[iNewEn
36a90 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  d].    );.  }.. 
36aa0 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b   pData = &aData[
36ab0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
36ac0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b  &aData[hdr+5])];
36ad0 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65  .  if( pData<pBe
36ae0 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70  gin ) goto editp
36af0 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20  age_fail;..  /* 
36b00 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65  Add cells to the
36b10 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
36b20 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77  ge */.  if( iNew
36b30 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74  <iOld ){.    int
36b40 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77   nAdd = MIN(nNew
36b50 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20  ,iOld-iNew);.   
36b60 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69   assert( (iOld-i
36b70 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65  New)<nNew || nCe
36b80 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54  ll==0 || CORRUPT
36b90 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c  _DB );.    pCell
36ba0 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
36bb0 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  Idx;.    memmove
36bc0 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a  (&pCellptr[nAdd*
36bd0 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43  2], pCellptr, nC
36be0 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ell*2);.    if( 
36bf0 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
36c00 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20  .          pPg, 
36c10 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
36c20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
36c30 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c      nAdd, &apCel
36c40 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c  l[iNew], &szCell
36c50 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67  [iNew].    ) ) g
36c60 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
36c70 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20  l;.    nCell += 
36c80 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nAdd;.  }..  /* 
36c90 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  Add any overflow
36ca0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28   cells */.  for(
36cb0 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65  i=0; i<pPg->nOve
36cc0 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  rflow; i++){.   
36cd0 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f   int iCell = (iO
36ce0 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c  ld + pPg->aiOvfl
36cf0 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20  [i]) - iNew;.   
36d00 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26   if( iCell>=0 &&
36d10 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20   iCell<nNew ){. 
36d20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20       pCellptr = 
36d30 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69  &pPg->aCellIdx[i
36d40 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20  Cell * 2];.     
36d50 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70   memmove(&pCellp
36d60 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  tr[2], pCellptr,
36d70 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29   (nCell - iCell)
36d80 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65   * 2);.      nCe
36d90 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ll++;.      if( 
36da0 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
36db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67  .            pPg
36dc0 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
36dd0 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
36de0 20 20 20 20 20 20 20 20 31 2c 20 26 61 70 43 65          1, &apCe
36df0 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d  ll[iCell + iNew]
36e00 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20  , &szCell[iCell 
36e10 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20  + iNew].      ) 
36e20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
36e30 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fail;.    }.  }.
36e40 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c  .  /* Append cel
36e50 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ls to the end of
36e60 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
36e70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e  Cellptr = &pPg->
36e80 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
36e90 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73  ];.  if( pageIns
36ea0 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20  ertArray(.      
36eb0 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26    pPg, pBegin, &
36ec0 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c  pData, pCellptr,
36ed0 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43  .        nNew-nC
36ee0 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  ell, &apCell[iNe
36ef0 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c  w+nCell], &szCel
36f00 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20  l[iNew+nCell].  
36f10 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
36f20 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e  e_fail;..  pPg->
36f30 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20  nCell = nNew;.  
36f40 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  pPg->nOverflow =
36f50 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28   0;..  put2byte(
36f60 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  &aData[hdr+3], p
36f70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  Pg->nCell);.  pu
36f80 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36f90 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44  r+5], pData - aD
36fa0 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ata);..#ifdef SQ
36fb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
36fc0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20  (i=0; i<nNew && 
36fd0 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b  !CORRUPT_DB; i++
36fe0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
36ff0 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77   = apCell[i+iNew
37000 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ];.    int iOff 
37010 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 67 2d  = get2byte(&pPg-
37020 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b  >aCellIdx[i*2]);
37030 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
37040 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26  aData && pCell<&
37050 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e  aData[pPg->pBt->
37060 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20  usableSize] ){. 
37070 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
37080 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
37090 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
370a0 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70  ert( 0==memcmp(p
370b0 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66  Cell, &aData[iOf
370c0 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65  f], szCell[i+iNe
370d0 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  w]) );.  }.#endi
370e0 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64  f..  return;. ed
370f0 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f  itpage_fail:.  /
37100 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74  * Unable to edit
37110 20 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75   this page. Rebu
37120 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61  ild it from scra
37130 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a  tch instead. */.
37140 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50    rebuildPage(pP
37150 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c  g, nNew, &apCell
37160 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iNew], &szCell[
37170 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iNew]);.}../*.**
37180 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
37190 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
371a0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
371b0 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
371c0 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
371d0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
371e0 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
371f0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
37200 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
37210 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
37220 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
37230 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
37240 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
37250 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
37260 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
37270 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
37280 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
37290 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
372a0 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
372b0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
372c0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
372d0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
372e0 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
372f0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
37300 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
37310 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
37320 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
37330 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
37340 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
37350 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
37360 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
37370 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
37380 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
37390 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
373a0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
373b0 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
373c0 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
373d0 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
373e0 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
373f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37400 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
37410 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
37420 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
37430 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
37440 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
37450 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
37460 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
37470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37480 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
37490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
374a0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
374b0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
374c0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
374d0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
374e0 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
374f0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
37500 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
37510 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
37520 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
37530 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
37540 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
37550 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
37560 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
37570 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
37580 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
37590 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
375a0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
375b0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
375c0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
375d0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
375e0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
375f0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
37600 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
37610 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
37620 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
37630 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
37640 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
37650 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
37660 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
37670 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
37680 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
37690 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
376a0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
376b0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
376c0 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
376d0 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
376e0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
376f0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
37700 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
37710 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
37720 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
37730 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
37740 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
37750 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
37760 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
37770 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
37780 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
37790 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
377a0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
377b0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
377c0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
377d0 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
377e0 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
377f0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
37800 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
37810 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
37820 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
37830 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
37840 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
37850 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
37860 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
37870 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
37880 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
37890 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
378a0 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
378b0 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
378c0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
378d0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
378e0 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
378f0 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
37900 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
37910 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
37920 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
37930 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
37940 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
37950 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37970 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
37980 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
37990 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
379c0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
379d0 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37a00 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
37a10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
37a20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
37a30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
37a40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37a50 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37a60 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
37a70 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37a80 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37a90 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
37aa0 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
37ab0 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
37ac0 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
37ad0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
37ae0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
37af0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  pPage->nCell==0)
37b00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
37b10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
37b20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
37b30 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
37b40 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
37b50 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
37b60 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
37b70 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
37b80 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
37b90 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
37ba0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
37bb0 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
37bc0 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
37bd0 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
37be0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
37bf0 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
37c00 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
37c10 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
37c20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
37c30 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
37c40 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
37c50 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
37c60 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
37c70 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76  ll = pPage->apOv
37c80 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73  fl[0];.    u16 s
37c90 7a 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 78  zCell = pPage->x
37ca0 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
37cb0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a  pCell);.    u8 *
37cc0 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65  pStop;..    asse
37cd0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
37ce0 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77  Iswriteable(pNew
37cf0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
37d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
37d10 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f  >aData[0]==(PTF_
37d20 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
37d30 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b  ATA|PTF_LEAF) );
37d40 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
37d50 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ew, PTF_INTKEY|P
37d60 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
37d70 4c 45 41 46 29 3b 0a 20 20 20 20 72 65 62 75 69  LEAF);.    rebui
37d80 6c 64 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  ldPage(pNew, 1, 
37d90 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
37da0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65  ;.    pNew->nFre
37db0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
37dc0 69 7a 65 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c  ize - pNew->cell
37dd0 4f 66 66 73 65 74 20 2d 20 32 20 2d 20 73 7a 43  Offset - 2 - szC
37de0 65 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ell;..    /* If 
37df0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
37e00 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
37e10 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
37e20 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
37e30 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
37e40 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
37e50 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
37e60 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
37e70 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
37e80 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
37e90 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
37ea0 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
37eb0 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
37ec0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
37ed0 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
37ee0 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
37ef0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
37f00 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
37f10 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
37f20 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
37f30 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
37f40 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
37f50 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
37f60 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
37f70 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
37f80 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
37f90 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
37fa0 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
37fb0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
37fc0 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
37fd0 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
37fe0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
37ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
38000 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
38010 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
38020 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
38030 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
38040 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
38050 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
38060 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
38070 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
38080 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
38090 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
380a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
380b0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
380c0 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
380d0 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
380e0 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
380f0 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
38100 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
38110 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
38120 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
38130 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
38140 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
38150 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
38160 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
38170 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
38180 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
38190 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
381a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
381b0 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
381c0 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
381d0 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
381e0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
381f0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
38200 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
38210 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
38220 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
38230 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
38240 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
38250 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
38260 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
38270 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
38280 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
38290 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
382a0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
382b0 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
382c0 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
382d0 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
382e0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
382f0 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
38300 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
38310 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
38320 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
38330 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
38340 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
38350 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
38360 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
38370 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
38380 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
38390 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
383a0 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
383b0 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
383c0 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
383d0 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
383e0 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
383f0 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
38400 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
38410 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
38420 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
38430 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
38440 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
38450 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
38460 74 20 74 68 65 2