/ Hex Artifact Content
Login

Artifact af43a8326a8af14ae933853850da740f93163383:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3c80: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42  orOwnsBtShared(B
3c90: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61  tCursor *p){.  a
3ca0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3cb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3cc0: 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65  return (p->pBtre
3cd0: 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64  e->db==p->pBt->d
3ce0: 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  b);.}.#endif../*
3cf0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3d00: 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
3d10: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
3d20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3d30: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
3d40: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
3d50: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
3d60: 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  Bt..*/.#define 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 43 75 72 29 20 28 70 43  wCache(pCur) (pC
3d90: 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
3da0: 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  ~BTCF_ValidOvfl)
3db0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3dc0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3dd0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
3de0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
3df0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
3e00: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
3e10: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
3e20: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
3e30: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
3e40: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
3e50: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
3e60: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
3e70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3e80: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
3e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
3ec0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3ed0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  che(p);.  }.}..#
3ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ef0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
3f00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f10: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3f20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3f30: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3f40: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3f50: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3f60: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3f70: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3f80: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3f90: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3fa0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3fb0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3fc0: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3fd0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3fe0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3ff0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
4000: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
4010: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4020: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
4030: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
4040: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
4050: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
4060: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
4070: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
4080: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4090: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40a0: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
40b0: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
40c0: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
40d0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
40e0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
40f0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
4100: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
4110: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
4120: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
4130: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
4140: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4150: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
4160: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
4170: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
4180: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4190: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
41a0: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
41d0: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
41e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
41f0: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
4200: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
4210: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
4220: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
4230: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
4240: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4250: 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75  lobCur==0 ) retu
4260: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rn;.  assert( sq
4270: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4280: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4290: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
42a0: 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20  rblobCur = 0;.  
42b0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
42c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
42d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
42e0: 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73  if( (p->curFlags
42f0: 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62   & BTCF_Incrblob
4300: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
4310: 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f  tree->hasIncrblo
4320: 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  bCur = 1;.      
4330: 69 66 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65  if( isClearTable
4340: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
4350: 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ==iRow ){.      
4360: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4370: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4380: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4390: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
43a0: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
43b0: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
43c0: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
43d0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
43e0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
43f0: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
4400: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4410: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
4420: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
4430: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4440: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4450: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
4460: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
4470: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
4480: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
4490: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
44a0: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
44b0: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
44c0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
44d0: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
44e0: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
44f0: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
4500: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
4510: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
4520: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
4530: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
4540: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
4550: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
4560: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
4570: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
4580: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
4590: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
45a0: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
45b0: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
45c0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
45d0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
45e0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
45f0: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4600: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
4610: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
4620: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
4630: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
4640: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
4650: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
4660: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
4670: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
4680: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
4690: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
46a0: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
46b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
46c0: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
46d0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
46e0: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
46f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4700: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4710: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
4720: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
4730: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
4740: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
4750: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
4760: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
4770: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
4780: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
4790: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
47a0: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
47b0: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
47c0: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
47d0: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
47e0: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
47f0: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4800: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
4810: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
4820: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
4830: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
4840: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
4850: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
4860: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4870: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
4880: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4890: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
48a0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
48b0: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
48c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48d0: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
48e0: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
48f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4900: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
4910: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
4920: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
4930: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
4940: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
4950: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
4960: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4970: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
4980: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
4990: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
49c0: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
49d0: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
49e0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
49f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4a00: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
4a10: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
4a20: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
4a30: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
4a40: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
4a50: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
4a60: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4a70: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
4a80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4a90: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4aa0: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4ab0: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4ac0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4ad0: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4ae0: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4af0: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
4b00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4b10: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
4b20: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4b30: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4b40: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4b50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4b80: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
4b90: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
4ba0: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4bb0: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
4bc0: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
4bd0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4be0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
4bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4c20: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
4c30: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
4c40: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
4c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4c60: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
4c70: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
4c80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
4ca0: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
4cb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
4cc0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
4cd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4ce0: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
4cf0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4d00: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
4d10: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
4d20: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
4d30: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
4d40: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
4d50: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
4d60: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
4d70: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
4d80: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
4d90: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
4da0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
4db0: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
4dc0: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4dd0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
4de0: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
4df0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
4e00: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
4e10: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
4e20: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
4e30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4e40: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
4e50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
4e60: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
4e70: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
4e80: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
4e90: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
4ea0: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
4eb0: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
4ec0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
4ee0: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
4ef0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
4f00: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
4f10: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
4f20: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
4f30: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4f40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
4f50: 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ase all of the a
4f60: 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f  pPage[] pages fo
4f70: 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
4f80: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4f90: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
4fa0: 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a  Pages(BtCursor *
4fb0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
4fc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
4fd0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
4fe0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
4ff0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
5000: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  );.    pCur->apP
5010: 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  age[i] = 0;.  }.
5020: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5030: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  -1;.}../*.** The
5040: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5050: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
5060: 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ent must point t
5070: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a  o a valid entry.
5080: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
5090: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
50a0: 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74  (i.e. have eStat
50b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
50c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
50d0: 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72  on saves the cur
50e0: 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20  rent cursor key 
50f0: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75  in variables pCu
5100: 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70  r->nKey and.** p
5110: 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54  Cur->pKey. SQLIT
5120: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
5130: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
5140: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
5150: 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  r .** code other
5160: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
5170: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
5180: 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74  n on an intkey t
5190: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69  able, then the i
51a0: 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74  nteger key.** (t
51b0: 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f  he rowid) is sto
51c0: 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  red in pCur->nKe
51d0: 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79  y and pCur->pKey
51e0: 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a   is left set to.
51f0: 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  ** NULL. If the 
5200: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5210: 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74  n a non-intkey t
5220: 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d  able, then pCur-
5230: 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74  >pKey is .** set
5240: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d   to point to a m
5250: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70  alloced buffer p
5260: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
5270: 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
5280: 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a  ng .** the key..
5290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
52a0: 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75  veCursorKey(BtCu
52b0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
52c0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
52d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
52f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5300: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5310: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5320: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5340: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
5350: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
5360: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
5370: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
5380: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
5390: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
53a0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
53b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
53c0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
53d0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
53e0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
53f0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5400: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5410: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5420: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5430: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5450: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5460: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5470: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5480: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
5490: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
54a0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
54b0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 20 20  ey .  ** data.  
54c0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72  */.  if( 0==pCur
54d0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20  ->curIntKey ){. 
54e0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
54f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
5500: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
5510: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
5520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5530: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
5540: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
5550: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
5560: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5570: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
5580: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
5590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
55a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
55b0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
55c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
55e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
55f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5600: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5610: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5620: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5630: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5640: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5650: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5660: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5670: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5680: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5690: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
56a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
56b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
56c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
56d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
56e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
56f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5700: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5710: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5720: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5730: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5740: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5750: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5760: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5770: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5780: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5790: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
57a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
57c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
57d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
57e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
57f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5800: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5810: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5820: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5830: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5840: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5850: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5860: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5870: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5890: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
58a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
58b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
58c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
58d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
58e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
58f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5900: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5910: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5920: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5940: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5960: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5970: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5980: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5990: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
59a0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
59b0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
59c0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
59d0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
59e0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
59f0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5a00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5a10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5a20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5a30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5a40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5a50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5a60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5a70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5a80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5a90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5aa0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5ab0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5ac0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5ad0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5ae0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5af0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5b00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5b10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5b20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5b30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5b40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5b50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5b60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5b70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5b80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5b90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ba0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5bb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5bc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5bd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5be0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5c00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5c10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5c20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5c30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5c40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5c50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5c60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5c70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5c80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5c90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5ca0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5cb0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5cc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5cd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5ce0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5cf0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5d00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5d10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5d20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5d30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5d40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5d50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5d60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5d70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5d80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5d90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5da0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5db0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5dc0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5dd0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ef0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5f00: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5f10: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5f20: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5f30: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5f40: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5f50: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5f60: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5f70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5f80: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5f90: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5fa0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5fb0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5fc0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5fd0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5fe0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5ff0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6000: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6010: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6020: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6030: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6040: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6060: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6070: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6080: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6090: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
60a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
60b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
60c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
60d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
60e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
60f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6100: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6110: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6120: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6130: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6140: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6150: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6160: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6170: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6180: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6190: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
61a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
61b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
61c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
61d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
61e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
61f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6200: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6210: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6220: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6230: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6240: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6250: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6260: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6270: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
62a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
62b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
62c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
62d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
62e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
62f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6300: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6320: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6330: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6340: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6350: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6360: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6370: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6380: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6390: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
63a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
63b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
63c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
63d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
63e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
63f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6400: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6410: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6420: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6430: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6440: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6450: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6460: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6470: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6480: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6490: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
64a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
64b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
64c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
64d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
64e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
64f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6500: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6510: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6520: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6530: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6540: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6550: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6570: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6580: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6590: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
65a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
65c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
65d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
65e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
65f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6600: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6610: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6640: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6650: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6660: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6670: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
6680: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6690: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
66a0: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
66b0: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
66c0: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
66d0: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
66e0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
66f0: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6700: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6710: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6720: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6730: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
6740: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
6750: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
6760: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
6770: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
6780: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
67a0: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
67b0: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
67c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
67d0: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
67e0: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
67f0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6800: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6810: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6820: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
6830: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
6840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
6870: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
6880: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6890: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
68a0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
68b0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
68c0: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
68d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
68e0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68f0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6920: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6930: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
6940: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
6950: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
6960: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
6970: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
6980: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6990: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
69a0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
69b0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
69c0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
69d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
69e0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
69f0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6a00: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6a10: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a20: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
6a30: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
6a40: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6a70: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6a80: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6a90: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6aa0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6ab0: 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
6ac0: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6ad0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6ae0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6af0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6b00: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6b10: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6b20: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6b30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6b40: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6b50: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
6b60: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6b70: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6b80: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6b90: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6ba0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6bc0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6bd0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6be0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6bf0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6c00: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6c10: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6c20: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6c30: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6c40: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6c50: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6c60: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6c70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6c80: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6c90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6ca0: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6cb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6cc0: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6cd0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6ce0: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6cf0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6d00: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6d10: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6d20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6d30: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6d40: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6d50: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6d60: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6d70: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6d80: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6d90: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6da0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6db0: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6dc0: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6dd0: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6de0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6df0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6e00: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6e10: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6e20: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6e30: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6e40: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6e50: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6e60: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6e70: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6e80: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6e90: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6ea0: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
6eb0: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
6ec0: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
6ed0: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
6ee0: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
6ef0: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
6f00: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
6f10: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
6f20: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
6f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6f40: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
6f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f60: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
6f70: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
6f80: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
6f90: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6fb0: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
6fc0: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
6fd0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
6fe0: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
6ff0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
7000: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
7010: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
7020: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
7030: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
7040: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
7050: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
7060: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
7070: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
7080: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
7090: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
70a0: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
70b0: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
70c0: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
70d0: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
70e0: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
70f0: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
7100: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
7110: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
7120: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
7130: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
7140: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
7150: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
7160: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
7170: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
7180: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
7190: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
71a0: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
71b0: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
71c0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
71d0: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
71e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
71f0: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7200: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
7210: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
7220: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7230: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
7240: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
7250: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7260: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
7270: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7280: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
7290: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
72a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
72b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
72c0: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
72d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
72e0: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
72f0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7300: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7310: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
7320: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
7330: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
7340: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7350: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
7360: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7370: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
7380: 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73  ** Provide hints
7390: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20   to the cursor. 
73a0: 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   The particular 
73b0: 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20  hint given (and 
73c0: 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20  the type.** and 
73d0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61  number of the va
73e0: 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73  rargs parameters
73f0: 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  ) is determined 
7400: 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65  by the eHintType
7410: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20  .** parameter.  
7420: 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69  See the definiti
7430: 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45  ons of the BTREE
7440: 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66  _HINT_* macros f
7450: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76  or details..*/.v
7460: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7470: 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72  CursorHint(BtCur
7480: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65  sor *pCur, int e
7490: 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a  HintType, ...){.
74a0: 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62    /* Used only b
74b0: 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  y system that su
74c0: 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f  bstitute their o
74d0: 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  wn storage engin
74e0: 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  e */.}.#endif../
74f0: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61  *.** Provide fla
7500: 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  g hints to the c
7510: 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
7520: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7530: 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72  rHintFlags(BtCur
7540: 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67  sor *pCur, unsig
7550: 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74  ned x){.  assert
7560: 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f  ( x==BTREE_SEEK_
7570: 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42  EQ || x==BTREE_B
7580: 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20  ULKLOAD || x==0 
7590: 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73  );.  pCur->hints
75a0: 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65   = x;.}...#ifnde
75b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
75c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
75d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
75e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
75f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
7600: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
7610: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
7620: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
7630: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
7640: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
7650: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
7660: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
7670: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
7680: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
7690: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
76a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
76b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
76c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
76d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
76e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
76f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
7700: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
7710: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
7720: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
7730: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7740: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
7750: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7760: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
7770: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
7780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
77a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
77b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
77c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
77d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
77e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
77f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7800: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
7810: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7820: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
7830: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
7840: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
7850: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
7860: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
7870: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
7880: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
7890: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
78a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
78b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
78c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
78d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
78e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
78f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
7900: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
7910: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7920: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
7930: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
7940: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
7950: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
7960: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
7970: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
7980: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
7990: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
79a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
79b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
79c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
79d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
79e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
79f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7a00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7a10: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
7a20: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7a30: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7a40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7a50: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7a60: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7a70: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7a80: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7aa0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7ab0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7ac0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7ad0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7ae0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7af0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7b00: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7b10: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7b20: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7b30: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7b40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7b50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7b60: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7b70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7b80: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7b90: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7bb0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7bc0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7bd0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7be0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7bf0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7c00: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7c10: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7c20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7c30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7c50: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7c60: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7c70: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7c80: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7c90: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ca0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
7cb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7cc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
7cd0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
7ce0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7cf0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7d00: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
7d10: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
7d20: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7d30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7d40: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
7d50: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
7d60: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
7d70: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
7d80: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
7d90: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
7da0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7db0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
7dc0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
7dd0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
7de0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7df0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
7e00: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
7e10: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
7e20: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
7e30: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
7e40: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
7e50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
7e60: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
7e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7e80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
7e90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
7ea0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
7eb0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7ec0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
7ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
7ee0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
7ef0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7f00: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
7f10: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
7f20: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
7f30: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f40: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
7f50: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7f60: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7f70: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
7f80: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
7f90: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7fa0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
7fb0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
7fc0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
7fd0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7fe0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
7ff0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
8000: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
8010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8020: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
8030: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
8040: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
8050: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
8060: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
8070: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8080: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8090: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
80a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
80b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
80c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
80e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
80f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8100: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
8110: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
8120: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
8130: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
8140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8150: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8160: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
8170: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
8180: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8190: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
81a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
81b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
81c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
81d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
81e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
81f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
8200: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
8210: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
8220: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8230: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
8240: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
8250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
8260: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
8270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8280: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8290: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
82a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
82b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
82c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
82d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
82e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
82f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8300: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8310: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8320: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8330: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8340: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
8350: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
8360: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
8370: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8380: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
8390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
83a0: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
83b0: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
83c0: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
83d0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
83e0: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
83f0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8400: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8410: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8420: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8430: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8440: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8450: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8460: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8470: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8480: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8490: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
84a0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
84b0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
84c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
84d0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84e0: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
84f0: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8500: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8510: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8520: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8530: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8540: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8550: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8560: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8580: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8590: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
85a0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
85b0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
85c0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
85d0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
85e0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
85f0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8600: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8610: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8620: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8630: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8640: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8690: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
86a0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
86b0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
86c0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
86d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
86e0: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
86f0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8700: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8710: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8720: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8730: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8740: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8750: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8760: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8770: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8780: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
87a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
87b0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
87c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
87f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8800: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8810: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8820: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8830: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8840: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8850: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8860: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8870: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8880: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8890: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
88a0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
88b0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
88c0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
88d0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
88e0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
88f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
8900: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8910: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8920: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8930: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
8940: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8950: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8960: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8970: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
8980: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
8990: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
89b0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
89c0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
89d0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
89e0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
89f0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
8a00: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
8a10: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
8a20: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
8a30: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
8a40: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
8a50: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
8a60: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
8a70: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8a80: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8a90: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8aa0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
8ab0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
8ac0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
8ad0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
8ae0: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
8af0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
8b00: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
8b10: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
8b20: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
8b30: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
8b40: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
8b50: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
8b60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
8b70: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8b80: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8b90: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8ba0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8bb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
8bc0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
8bd0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
8be0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
8bf0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
8c00: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8c10: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
8c20: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8c30: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
8c40: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
8c50: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
8c60: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
8c70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8c80: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
8c90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
8ca0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
8cb0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8cc0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8cd0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8ce0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8cf0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8d00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8d10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8d20: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8d30: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8d40: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8d50: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
8d60: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
8d70: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
8d80: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
8d90: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8da0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
8db0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8dc0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8dd0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8de0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8df0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8e00: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8e10: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8e20: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8e30: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8e40: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8e50: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8e60: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
8e70: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
8e80: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
8e90: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8ea0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8eb0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8ec0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8ed0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ee0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8ef0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f00: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8f10: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8f20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8f30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8f40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8f50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8f70: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
8f80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8f90: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
8fa0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8fb0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
8fc0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
8fd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
8fe0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
8ff0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9000: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9010: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9020: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9030: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9040: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9050: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9060: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9070: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9080: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9090: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
90a0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
90b0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
90c0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
90d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
90e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
90f0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9100: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9110: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9130: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9150: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9160: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9170: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9190: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
91a0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
91b0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
91c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
91d0: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
91e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
91f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9200: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9210: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9220: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9230: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9240: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9250: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9270: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9280: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9290: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
92a0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
92b0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
92c0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
92d0: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
92e0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
92f0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9300: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9310: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9320: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9330: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9340: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9350: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9360: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9370: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9380: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9390: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
93a0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
93b0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
93c0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
93d0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
93e0: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
93f0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9400: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9410: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9420: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9430: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9440: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9450: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9460: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9470: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9480: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9490: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
94a0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
94b0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
94c0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
94d0: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
94e0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
94f0: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9500: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9510: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9520: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9530: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9540: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9550: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9560: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9570: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9580: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9590: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
95a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
95b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
95c0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
95d0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
95e0: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
95f0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9600: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9610: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9620: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9630: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9640: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9650: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9660: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9670: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9680: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9690: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
96a0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
96b0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
96c0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
96d0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
96e0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
96f0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9700: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9710: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9720: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9730: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9740: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9750: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9760: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9770: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9780: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9790: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
97a0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
97b0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
97c0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
97d0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
97e0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
97f0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9800: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9810: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9820: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9830: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9840: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9850: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9860: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9870: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9880: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9890: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
98a0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
98b0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
98c0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
98d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
98e0: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
98f0: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9900: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9910: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9920: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9930: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
9940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9970: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9980: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
9990: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
99a0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
99b0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
99c0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
99d0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
99e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
99f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9a00: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9a10: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9a20: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9a30: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9a40: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9a50: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9a60: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9a70: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9a80: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9a90: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9aa0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9ab0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
9ac0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
9ad0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9ae0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9af0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9b00: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9b10: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9b20: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9b30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9b40: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9b50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9b60: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9b70: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9b80: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9b90: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9ba0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9bb0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9bc0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9bd0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9be0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9bf0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9c00: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9c10: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9c20: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9c30: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9c40: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9c50: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9c60: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9c70: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9c80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9c90: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9ca0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9cb0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9cc0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9cd0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9ce0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
9cf0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
9d00: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
9d10: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
9d20: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9d40: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
9d50: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
9d60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
9d70: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
9d80: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
9d90: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
9da0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
9db0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
9dc0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
9dd0: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
9de0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
9df0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
9e00: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
9e10: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
9e20: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
9e30: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
9e40: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
9e50: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
9e60: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
9e70: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
9e80: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
9e90: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
9ea0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
9eb0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
9ec0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
9ed0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
9ee0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
9ef0: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
9f00: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
9f10: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
9f20: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
9f30: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
9f40: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
9f50: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
9f60: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
9f80: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
9f90: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
9fa0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
9fb0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
9fc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
9fd0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
9fe0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
9ff0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a000: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a010: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a020: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a030: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a060: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a070: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0a0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a0b0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a0c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a0d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a0e0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a0f0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a100: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a110: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a120: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a130: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a140: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a150: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a160: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a170: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a180: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a190: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a1a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a1b0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a1c0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a1d0: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a1e0: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a1f0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a200: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a210: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a220: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a230: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a240: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a250: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a260: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a270: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a280: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a290: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
a2a0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
a2b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
a2c0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
a2d0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
a2e0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
a2f0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
a300: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
a310: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
a320: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
a330: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
a340: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
a350: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
a360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
a370: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
a380: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
a390: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
a3a0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a3b0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
a3c0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
a3d0: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
a3e0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a3f0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a400: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
a410: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a420: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a430: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a440: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a450: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
a460: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
a470: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
a480: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
a490: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a4a0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
a4b0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
a4c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
a4d0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
a4e0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
a4f0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
a500: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
a510: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
a520: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
a530: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a540: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a550: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
a560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a570: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
a580: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
a590: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a5a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
a5b0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a5c0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a5d0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a5e0: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a5f0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a600: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a610: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a620: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a630: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a640: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a650: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a660: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a670: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a680: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a690: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a6a0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a6b0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a6c0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a6d0: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a6e0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a6f0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a700: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a710: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a720: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a730: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a740: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a750: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a760: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a770: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a780: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a790: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a7a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a7b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a7c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a7d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a7e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a7f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a800: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a810: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a820: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a830: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a840: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a850: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a860: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a870: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a880: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a890: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a8a0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a8b0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a8c0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a8d0: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a8e0: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a8f0: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a900: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a910: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a920: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a930: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a940: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a950: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
a960: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
a970: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
a980: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
a990: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
a9a0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
a9b0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
a9c0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
a9d0: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
a9e0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
a9f0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
aa00: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
aa10: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
aa20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aa30: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
aa40: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
aa50: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
aa60: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
aa70: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
aa80: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
aa90: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
aaa0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
aab0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
aac0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
aad0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
aae0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
aaf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
ab00: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
ab10: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
ab20: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
ab30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
ab40: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
ab50: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
ab60: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
ab70: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
ab80: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
ab90: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
aba0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
abb0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
abc0: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
abd0: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
abe0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
abf0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
ac00: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
ac10: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
ac20: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
ac30: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
ac40: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
ac50: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
ac60: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
ac70: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
ac80: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
ac90: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
aca0: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
acb0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
acc0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
acd0: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
ace0: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
acf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ad00: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
ad10: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
ad20: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
ad30: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
ad40: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
ad50: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
ad60: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
ad70: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
ad80: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
ad90: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
ada0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
adb0: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
adc0: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
add0: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
ade0: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
adf0: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
ae00: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
ae10: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
ae20: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
ae30: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
ae40: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ae60: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
ae70: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ae90: 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  ss of the i-th c
aea0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ell */.  int hdr
aeb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aec0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
aed0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
aee0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
af10: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
af20: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
af30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
af40: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
af50: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
af60: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
af70: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af80: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
af90: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
afa0: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
afb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
afc0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
afd0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
afe0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b000: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
b010: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b020: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b030: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
b040: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
b050: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b060: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
b070: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
b080: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
b090: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b0a0: 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  src;        /* S
b0b0: 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74  ource of content
b0c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
b0d0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
b0e0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b0f0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b100: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
b110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
b120: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
b130: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
b140: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b150: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
b160: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
b170: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b180: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
b190: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1a0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b1b0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
b1c0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
b1d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
b1e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
b1f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b200: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b210: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b220: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
b230: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
b240: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
b250: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b260: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
b270: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
b280: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
b290: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
b2a0: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
b2b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b2c0: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
b2d0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
b2e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
b2f0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
b300: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
b310: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
b320: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
b330: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
b340: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
b350: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
b360: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
b370: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
b380: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
b390: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
b3a0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
b3b0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
b3c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
b3d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
b3e0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b3f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
b400: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
b410: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
b420: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
b430: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
b440: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
b450: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52  e().    ** if PR
b460: 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
b470: 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a  heck=ON..    */.
b480: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
b490: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
b4a0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
b4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b4c0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
b4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
b4e0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
b4f0: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
b500: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
b510: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
b520: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
b530: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
b540: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
b550: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
b560: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
b570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b580: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b590: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
b5a0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
b5b0: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
b5c0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
b5d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b5e0: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
b5f0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
b600: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
b610: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b620: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
b630: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
b640: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
b650: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
b660: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
b670: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
b680: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
b690: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
b6a0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
b6b0: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
b6c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
b6d0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
b6e0: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
b6f0: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
b700: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
b710: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
b720: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
b730: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
b740: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ize);.  }.  asse
b750: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
b760: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
b770: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
b780: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
b790: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
b7a0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
b7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
b7c0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
b7d0: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
b7e0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
b7f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b800: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b810: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b820: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
b830: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
b840: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
b850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b870: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b880: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
b890: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
b8a0: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
b8b0: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
b8c0: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
b8d0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
b8e0: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
b8f0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
b900: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
b910: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
b920: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
b930: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
b940: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
b950: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
b960: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
b970: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
b980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
b990: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
b9a0: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
b9b0: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
b9c0: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
b9d0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
b9e0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
b9f0: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
ba00: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ba10: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
ba20: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
ba30: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
ba40: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
ba50: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
ba60: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
ba70: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
ba80: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
ba90: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
baa0: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
bab0: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
bac0: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
bad0: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
bae0: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
baf0: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
bb00: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
bb10: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
bb20: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
bb30: 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  set;.  u8 * cons
bb40: 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
bb50: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64  Data;.  int iAdd
bb60: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
bb70: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
bb80: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
bb90: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20  .  int x;.  int 
bba0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
bbb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bbc0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63  e;..  assert( pc
bbd0: 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >0 );.  do{.    
bbe0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
bbf0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
bc00: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
bc10: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
bc20: 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31  -OF: R-06866-391
bc30: 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72  25 Freeblocks ar
bc40: 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74  e always connect
bc50: 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20  ed in order of. 
bc60: 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67     ** increasing
bc70: 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20   offset. */.    
bc80: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
bc90: 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b  e-4 || pc<iAddr+
bca0: 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  4 ){.      *pRc 
bcb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bcc0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
bcd0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
bce0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bcf0: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
bd00: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
bd10: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
bd20: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
bd30: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
bd40: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
bd50: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
bd60: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
bd70: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
bd80: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
bd90: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
bda0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
bdb0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
bdc0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
bdd0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
bde0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
bdf0: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
be00: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
be10: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  3 );.      if( p
be20: 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66  c < pPg->cellOff
be30: 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c  set+2*pPg->nCell
be40: 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73   || size+pc > us
be50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
be60: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
be70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
be80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
be90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
bea0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
beb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bec0: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
bed0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
bee0: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
bef0: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
bf00: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
bf10: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
bf20: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
bf30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
bf40: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
bf50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
bf60: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
bf70: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
bf80: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
bf90: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
bfa0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
bfb0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
bfc0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
bfd0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
bfe0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
bff0: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
c000: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
c010: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
c020: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c030: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
c040: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
c050: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
c060: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
c070: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
c080: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
c090: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
c0a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
c0b0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
c0c0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
c0d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c0e0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
c0f0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
c100: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
c110: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c120: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
c130: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
c140: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c150: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
c160: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
c170: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
c180: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
c190: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
c1a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
c1b0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
c1c0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
c1d0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
c1e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
c1f0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
c200: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
c210: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
c220: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
c230: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
c240: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
c250: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
c260: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
c270: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
c280: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
c290: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
c2a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c2b0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
c2c0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
c2d0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
c2e0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
c2f0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
c300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c310: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
c320: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
c330: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
c340: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
c350: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
c360: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
c370: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
c380: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
c390: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
c3a0: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
c3b0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
c3c0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
c3d0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
c3e0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
c3f0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
c400: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
c410: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
c420: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
c430: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
c440: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c450: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
c460: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
c470: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
c480: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
c490: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
c4a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
c4b0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c4e0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
c4f0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
c500: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c510: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
c520: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
c530: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c540: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
c550: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
c560: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
c570: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
c580: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
c590: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
c5a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c5b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c5c0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c5d0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
c5e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c5f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c600: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c610: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
c620: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
c630: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
c640: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
c650: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
c660: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
c670: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
c680: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
c690: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
c6a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c6b0: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
c6c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
c6d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
c6e0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
c6f0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
c700: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c710: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c720: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
c730: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
c740: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c750: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
c760: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
c770: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
c780: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
c790: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
c7a0: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
c7b0: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
c7c0: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
c7d0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
c7e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
c7f0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
c800: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
c810: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
c820: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
c830: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
c840: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
c850: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
c860: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
c870: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
c880: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
c890: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
c8a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c8b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
c8c0: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
c8d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
c8e0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
c8f0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
c900: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
c910: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
c920: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
c930: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c940: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
c950: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
c960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c980: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
c990: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
c9a0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
c9b0: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61  space between ga
c9c0: 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e  p and top for on
c9d0: 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e  e more cell poin
c9e0: 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65  ter.  ** array e
c9f0: 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64  ntry offset, and
ca00: 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   if the freelist
ca10: 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74   is not empty, t
ca20: 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20  hen search the. 
ca30: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f   ** freelist loo
ca40: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
ca50: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
ca60: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72  to satisfy the r
ca70: 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74  equest..  */.  t
ca80: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
ca90: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
caa0: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
cab0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
cac0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28  ==top );.  if( (
cad0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64  data[hdr+2] || d
cae0: 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67  ata[hdr+1]) && g
caf0: 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20  ap+2<=top ){.   
cb00: 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61   u8 *pSpace = pa
cb10: 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65  geFindSlot(pPage
cb20: 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20  , nByte, &rc);. 
cb30: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
cb40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cb50: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
cb60: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
cb70: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
cb80: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
cb90: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
cba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cbb0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
cbc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
cbd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cbe0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
cbf0: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
cc00: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
cc10: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
cc20: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
cc30: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
cc40: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
cc50: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
cc60: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
cc70: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
cc80: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
cc90: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
cca0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
ccb0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
ccc0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
ccd0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
cce0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
ccf0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
cd00: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
cd10: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
cd20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
cd30: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
cd40: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
cd50: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
cd60: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
cd70: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
cd80: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
cd90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
cda0: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
cdb0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
cdc0: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
cdd0: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
cde0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
cdf0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
ce00: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
ce10: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
ce20: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
ce30: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
ce40: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
ce50: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
ce60: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
ce70: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
ce80: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
ce90: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
cea0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
ceb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
cec0: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
ced0: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
cee0: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
cef0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
cf00: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
cf10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cf30: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
cf40: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
cf50: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
cf60: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
cf70: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
cf80: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
cf90: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
cfa0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
cfb0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
cfc0: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
cfd0: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
cfe0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
cff0: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
d000: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
d010: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
d020: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
d030: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
d040: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
d050: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
d060: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
d070: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
d080: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
d090: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
d0a0: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
d0b0: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
d0c0: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
d0d0: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
d0e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d0f0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
d100: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
d110: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
d120: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
d130: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
d140: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
d150: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
d160: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
d170: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
d180: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
d190: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
d1a0: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
d1b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
d1e0: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
d1f0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
d200: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d220: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
d230: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d240: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
d270: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
d280: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
d290: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
d2c0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
d2d0: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
d2e0: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d300: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
d310: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32  f iSize */.  u32
d320: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
d330: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d340: 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f  4; /* Largest po
d350: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
d360: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
d370: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
d380: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
d390: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
d3a0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
d3b0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
d3c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
d3d0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d3e0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
d3f0: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
d400: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
d410: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d420: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d430: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d440: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d450: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
d460: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
d470: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
d480: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
d490: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
d4a0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
d4b0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d4c0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
d4d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d4e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
d4f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d500: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
d510: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
d520: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d530: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
d540: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
d550: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
d560: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
d570: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
d580: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
d590: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
d5a0: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
d5b0: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
d5c0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
d5d0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
d5e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
d5f0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
d600: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
d610: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
d620: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
d630: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
d640: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
d650: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
d660: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
d670: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
d680: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
d690: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d6a0: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
d6b0: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
d6c0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
d6d0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
d6e0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
d6f0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
d700: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
d710: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d720: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
d730: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
d740: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
d750: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
d760: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
d770: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
d780: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
d790: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
d7a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d7b0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
d7c0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
d7d0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
d7e0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
d7f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
d810: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
d820: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
d830: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
d840: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
d850: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
d860: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
d870: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
d880: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
d890: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
d8a0: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
d8b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
d8c0: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
d8d0: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
d8e0: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
d8f0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
d900: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
d910: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
d920: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d930: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
d940: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
d950: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
d960: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
d970: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
d980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d990: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d9a0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
d9b0: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
d9c0: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
d9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
d9e0: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
d9f0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
da00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
da20: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
da30: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
da40: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
da50: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
da60: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
da70: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
da80: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
da90: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
daa0: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
dab0: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
dac0: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
dad0: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
dae0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
daf0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
db00: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
db10: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
db20: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
db30: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
db40: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
db50: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
db60: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
db70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
db80: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
db90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
dba0: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
dbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dbc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dbd0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
dbe0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
dbf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
dc00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
dc10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
dc20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
dc30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
dc40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
dc50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dc60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
dc70: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
dc80: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
dc90: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
dca0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
dcb0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
dcc0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
dcd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
dce0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
dcf0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
dd00: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
dd10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
dd20: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
dd30: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
dd40: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
dd50: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
dd60: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
dd70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
dd80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
dd90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dda0: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
ddb0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ddc0: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
ddd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
dde0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
ddf0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
de00: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
de10: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
de20: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
de30: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
de40: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
de50: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
de60: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
de70: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
de80: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
de90: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
dea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
deb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
dec0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
ded0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
dee0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
def0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
df00: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
df10: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
df20: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
df30: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
df40: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
df50: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
df60: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
df70: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
df80: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
df90: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
dfa0: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
dfb0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
dfc0: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
dfd0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
dfe0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
dff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e010: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e020: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e030: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e050: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e060: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e070: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
e080: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
e090: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
e0a0: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
e0b0: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
e0c0: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
e0d0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
e0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e0f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e100: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e110: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
e120: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
e130: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
e140: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
e150: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
e160: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
e170: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
e180: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
e190: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
e1a0: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
e1b0: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
e1c0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
e1d0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
e1e0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
e1f0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
e200: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e210: 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41   R-03640-13415 A
e220: 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e   value of 5 mean
e230: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
e240: 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a   interior.    **
e250: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
e260: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
e270: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
e280: 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20  |PTF_INTKEY)==5 
e290: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e2a0: 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36  CE-OF: R-20501-6
e2b0: 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20  1796 A value of 
e2c0: 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  13 means the pag
e2d0: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
e2e0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e2f0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e300: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e310: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
e320: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
e330: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e340: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
e350: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
e360: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e370: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
e380: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e390: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e3a0: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
e3b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
e3c0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
e3d0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
e3e0: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e3f0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e400: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
e410: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
e420: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
e430: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
e440: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e450: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
e460: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
e470: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
e480: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
e490: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
e4a0: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
e4b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
e4c0: 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75  225-53936 A valu
e4d0: 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65  e of 2 means the
e4e0: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
e4f0: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65  rior.    ** inde
e500: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e510: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e520: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e530: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e540: 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31  CE-OF: R-16571-1
e550: 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20  1615 A value of 
e560: 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  10 means the pag
e570: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
e580: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
e590: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e5a0: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
e5b0: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
e5c0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
e5d0: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
e5e0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e5f0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
e600: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
e610: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
e620: 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d  ndex;.    pPage-
e630: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e640: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
e650: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
e660: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
e670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e680: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e690: 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f  7608-56469 Any o
e6a0: 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  ther value for t
e6b0: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
e6c0: 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e  ype is.    ** an
e6d0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72   error. */.    r
e6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e6f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
e700: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
e710: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
e720: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
e730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e740: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
e750: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
e760: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
e770: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
e780: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
e790: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e7a0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
e7b0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
e7c0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
e7d0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
e7e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
e7f0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
e800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
e810: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
e820: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
e830: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
e840: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
e850: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
e860: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
e870: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
e880: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
e890: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
e8a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
e8b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
e8c0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
e8d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e8e0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
e8f0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
e900: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
e910: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e920: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e930: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
e940: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
e950: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
e960: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
e970: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
e980: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
e990: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
e9a0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
e9b0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e9c0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
e9d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
e9e0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e9f0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
ea00: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
ea10: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
ea20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
ea30: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
ea40: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
ea50: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
ea60: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
ea70: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
ea80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
ea90: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
eaa0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
eab0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
eac0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
ead0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
eae0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
eaf0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
eb00: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
eb10: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
eb20: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
eb30: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
eb40: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
eb50: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
eb60: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
eb70: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
eb80: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
eb90: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
eba0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
ebb0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
ebc0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
ebd0: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
ebe0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
ebf0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
ec00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ec10: 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rea */.    int i
ec20: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
ec30: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
ec40: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ec50: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ck offset */.   
ec60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
ec70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
ec80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
ec90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
eca0: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
ecb0: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
ecc0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
ecd0: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
ece0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
ecf0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ed00: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
ed10: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
ed20: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
ed30: 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
ed40: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
ed50: 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  type. */.    if(
ed60: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
ed70: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
ed80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ed90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
eda0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
edb0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
edc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
edd0: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
ede0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
edf0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
ee00: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
ee10: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
ee20: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
ee30: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ee40: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
ee50: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
ee60: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
ee70: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
ee80: 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  rSize;.    pPage
ee90: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
eea0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
eeb0: 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c      pPage->aCell
eec0: 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  Idx = &data[cell
eed0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61  Offset];.    pPa
eee0: 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
eef0: 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
ef00: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20  ldPtrSize];.    
ef10: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ef20: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ef30: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ef40: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ef50: 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a  esignates.    **
ef60: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ef70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ef80: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ef90: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
efa0: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74  er is.    ** int
efb0: 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33  erpreted as 6553
efc0: 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20  6. */.    top = 
efd0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
efe0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
eff0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f000: 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
f010: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f020: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f030: 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  3 gives the.    
f040: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
f050: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
f060: 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  */.    pPage->nC
f070: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
f080: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
f090: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
f0a0: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
f0b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
f0c0: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
f0d0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
f0e0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
f0f0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
f100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f110: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f120: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
f130: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
f140: 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
f150: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f160: 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
f170: 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
f180: 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
f190: 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a  ch is only.    *
f1a0: 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
f1b0: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
f1c0: 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
f1d0: 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
f1e0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66  n the.    ** off
f1f0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
f200: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
f210: 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
f220: 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
f230: 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
f240: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
f250: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
f260: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
f270: 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65   top==usableSize
f280: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
f290: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
f2a0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
f2b0: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
f2c0: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
f2d0: 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
f2e0: 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
f2f0: 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
f300: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
f310: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
f320: 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
f330: 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
f340: 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
f350: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
f360: 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
f370: 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
f380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
f390: 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
f3a0: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
f3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
f3c0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
f3d0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
f3e0: 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
f3f0: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
f400: 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70  e - 4;.    if( p
f410: 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
f420: 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
f430: 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  k ){.      int i
f440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f450: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
f460: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
f470: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
f480: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
f490: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
f4a0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
f4b0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f4c0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
f4d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
f4e0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
f4f0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
f500: 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61  yteAligned(&data
f510: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
f520: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f530: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
f540: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
f550: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f560: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
f570: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
f580: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
f590: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
f5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f5b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
f5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
f5d0: 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
f5e0: 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
f5f0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[pc]);.        
f600: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
f610: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
f620: 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
f630: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
f640: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f650: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f660: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
f670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f680: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f690: 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20  iCellLast++;.   
f6a0: 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d   }  ..    /* Com
f6b0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
f6c0: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
f6d0: 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49   page.    ** EVI
f6e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38  DENCE-OF: R-2358
f6f0: 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d  8-34450 The two-
f700: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f710: 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74  offset 1 gives t
f720: 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  he.    ** start 
f730: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65  of the first fre
f740: 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  eblock on the pa
f750: 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69  ge, or is zero i
f760: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
f770: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73     ** freeblocks
f780: 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  . */.    pc = ge
f790: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
f7a0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
f7b0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
f7c0: 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
f7d0: 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
f7e0: 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
f7f0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  */.    while( pc
f800: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
f810: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
f820: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
f830: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
f840: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
f850: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f860: 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
f870: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
f880: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
f890: 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
f8a0: 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
f8b0: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
f8c0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
f8d0: 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  eeblock..       
f8e0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   **.        ** O
f8f0: 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  r, the freeblock
f900: 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20   is off the end 
f910: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
f920: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f940: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
f950: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
f960: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
f970: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
f980: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
f990: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
f9a0: 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
f9b0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
f9c0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
f9d0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
f9e0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
f9f0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
fa00: 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
fa10: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
fa20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
fa30: 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
fa40: 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
fa50: 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
fa60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa80: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
fa90: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
faa0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
fab0: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
fac0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
fad0: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
fae0: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
faf0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
fb00: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
fb10: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
fb20: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
fb30: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
fb40: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
fb50: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
fb60: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
fb70: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
fb80: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
fb90: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
fba0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
fbb0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
fbc0: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
fbd0: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
fbe0: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
fbf0: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
fc00: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fc10: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
fc20: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
fc30: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
fc40: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
fc50: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
fc60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc70: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
fc80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fca0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
fcb0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
fcc0: 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
fcd0: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
fce0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
fcf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
fd00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fd10: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
fd20: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
fd30: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
fd40: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
fd50: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
fd60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fd70: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
fd80: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
fd90: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
fda0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
fdb0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
fdc0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
fdd0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
fde0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
fdf0: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
fe00: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
fe10: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
fe20: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
fe30: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
fe40: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
fe50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
fe60: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
fe70: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
fe80: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
fe90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
fea0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
feb0: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
fec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fed0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
fee0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
fef0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
ff00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ff10: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
ff20: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
ff30: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
ff40: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
ff50: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
ff60: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
ff70: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
ff80: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
ff90: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
ffa0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
ffb0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
ffc0: 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
ffd0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
ffe0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
fff0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
10000 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10010 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
10020 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
10030 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10040 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10050 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
10060 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10070 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
10080 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
10090 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
100a0 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
100b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
100c0 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
100d0 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
100e0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
100f0 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
10100 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
10110 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
10120 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
10130 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10140 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10150 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10160 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10170 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
10180 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
10190 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
101a0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
101b0 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
101c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
101d0 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
101e0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
101f0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
10200 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
10210 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
10220 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
10230 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10240 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
10250 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
10260 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
10270 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
10280 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10290 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
102a0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
102b0 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
102c0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
102d0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
102e0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
102f0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
10300 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
10310 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
10320 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
10330 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
10340 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
10350 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
10360 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
10370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10380 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
10390 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
103a0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
103b0 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
103c0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
103d0 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
103e0 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
103f0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10400 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10410 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
10420 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
10430 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
10440 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
10450 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10460 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
10470 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
10480 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
10490 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
104a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
104b0 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
104c0 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
104d0 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
104e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
104f0 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
10500 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
10510 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
10520 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
10530 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
10540 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
10550 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
10560 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
10570 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
10580 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
10590 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
105a0 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
105b0 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
105c0 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
105d0 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
105e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
105f0 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
10600 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
10610 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
10630 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
10640 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10650 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
10660 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
10670 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
10680 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
106a0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
106b0 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
106c0 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
106d0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
106e0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
106f0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
10700 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
10710 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
10720 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
10730 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
10740 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10750 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10760 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
10770 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
10780 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
10790 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
107a0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
107b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
107c0 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
107d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
107e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
107f0 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
10800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10810 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
10820 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
10830 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
10840 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
10850 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
10860 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
10870 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
10880 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
10890 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
108a0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
108b0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
108c0 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
108d0 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
108e0 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
108f0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
10900 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
10910 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
10920 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10930 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10940 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
10950 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
10960 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
10970 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
10980 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
10990 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
109a0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
109b0 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
109c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
109d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
109e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
109f0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
10a00 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
10a10 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
10a20 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
10a30 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
10a40 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
10a50 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
10a60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10a70 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
10a80 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
10a90 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
10aa0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
10ab0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
10ac0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
10ad0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
10ae0 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
10af0 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
10b00 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
10b10 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
10b20 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
10b30 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
10b40 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
10b50 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
10b60 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
10b70 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
10b80 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
10b90 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
10ba0 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
10bb0 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
10bc0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
10bd0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
10be0 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
10bf0 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
10c00 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
10c10 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
10c20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
10c30 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
10c40 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
10c50 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
10c60 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
10c70 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
10c80 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
10c90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
10ca0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
10cb0 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
10cc0 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
10cd0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
10ce0 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
10cf0 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
10d00 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
10d10 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
10d20 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
10d50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10d80 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
10d90 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10da0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
10db0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
10dc0 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
10dd0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
10de0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
10df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
10e00 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
10e10 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
10e20 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
10e30 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
10e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
10e50 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
10e60 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
10e70 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
10e80 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
10e90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10ea0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
10eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
10ec0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
10ed0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
10ee0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
10ef0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
10f00 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
10f10 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
10f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10f30 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
10f40 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
10f50 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
10f60 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
10f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
10f80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
10f90 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
10fa0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
10fb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10fc0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
10fd0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10fe0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
10ff0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
11000 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
11010 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11020 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
11030 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11040 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11050 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11060 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
11070 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
11080 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11090 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
110a0 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
110b0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
110c0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
110d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
110e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
110f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
11100 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11110 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11120 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
11130 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
11140 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
11150 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11160 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
11170 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11180 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
11190 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
111a0 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
111b0 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
111c0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
111d0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
111e0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
111f0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
11200 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
11210 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
11220 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
11230 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
11240 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
11250 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11260 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
11270 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11280 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11290 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
112a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
112b0 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
112c0 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
112d0 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
112e0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
112f0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
11300 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
11310 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
11320 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
11330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11340 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
11350 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
11360 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
11370 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
11380 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11390 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
113a0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
113b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
113c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
113d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
113e0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
113f0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
11400 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11410 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
11420 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11430 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11440 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11450 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
11460 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11470 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11480 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11490 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
114a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
114b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
114c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
114d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
114e0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
114f0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
11500 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11510 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
11520 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
11530 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
11540 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
11550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
11560 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
11570 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
11580 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
11590 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
115a0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
115b0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
115c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
115d0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
115e0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
115f0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
11600 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
11610 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
11620 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
11630 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
11640 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
11650 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
11660 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
11670 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
11680 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11690 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
116a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
116b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
116c0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
116d0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
116e0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
116f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11700 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11710 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11720 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
11730 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
11740 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
11750 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
11760 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11770 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
11780 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
11790 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
117a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
117b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
117c0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
117d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
117e0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
117f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11800 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
11810 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11830 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
11840 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
11850 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
11860 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
11870 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
11880 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
11890 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
118a0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
118b0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
118c0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
118d0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
118e0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
118f0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
11900 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
11910 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
11920 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
11930 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
11940 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
11950 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
11960 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11970 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
11980 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
11990 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
119a0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
119b0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
119c0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
119d0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
119e0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
119f0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
11a00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
11a10 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
11a20 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
11a30 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
11a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a50 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11a60 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
11a70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
11a80 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
11a90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11aa0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11ab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
11ac0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
11ad0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
11ae0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11af0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
11b00 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
11b10 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
11b20 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
11b30 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
11b40 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
11b50 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
11b60 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
11b70 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
11b80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
11b90 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
11ba0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
11bb0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
11bc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11bd0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
11be0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
11bf0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
11c00 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
11c10 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
11c20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11c30 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
11c40 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
11c50 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
11c60 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
11c70 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
11c80 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
11c90 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
11ca0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
11cb0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
11cc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
11cd0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
11ce0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
11cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11d00 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
11d10 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
11d20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11d30 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
11d40 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
11d50 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
11d60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11d70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
11d80 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
11d90 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
11da0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
11db0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
11dc0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
11dd0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
11de0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
11df0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
11e00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11e10 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
11e20 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
11e30 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
11e40 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
11e50 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
11e60 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
11e70 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
11e80 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
11e90 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
11ea0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
11eb0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
11ec0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
11ed0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11ee0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
11ef0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
11f00 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
11f10 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
11f20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
11f30 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
11f40 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
11f50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
11f60 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
11f70 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
11f80 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
11f90 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
11fa0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
11fb0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
11fc0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
11fd0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
11fe0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
11ff0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
12000 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
12010 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
12020 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12030 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
12040 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
12050 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
12060 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
12070 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
12080 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
12090 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
120a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
120b0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
120c0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
120d0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
120e0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
120f0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
12110 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
12120 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
12130 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
12140 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
12150 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
12160 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12170 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
12180 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
12190 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
121a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
121b0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
121c0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
121d0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
121e0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
121f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
12200 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
12210 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12220 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
12230 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
12240 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
12250 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
12260 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
12270 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12280 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
12290 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
122a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
122b0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
122c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
122d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
122e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
122f0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
12300 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
12310 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
12320 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
12330 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
12340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
12350 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
12360 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12370 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
12380 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
12390 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
123a0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
123b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
123c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
123d0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
123e0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
123f0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
12400 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
12410 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
12420 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
12430 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
12440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
12450 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
12460 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
12470 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
12480 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
12490 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
124a0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
124b0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
124c0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
124d0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
124e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
124f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
12500 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
12510 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
12520 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12530 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
12540 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
12550 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
12560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12570 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
12580 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12590 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
125a0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
125b0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
125c0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
125d0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
125e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
125f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
12600 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
12610 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
12620 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
12640 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
12650 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
12660 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12670 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
12680 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
12690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
126a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
126b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
126c0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
126d0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
126e0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
126f0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
12700 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
12710 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
12720 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
12730 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
12740 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
12750 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
12760 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12770 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
12780 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
12790 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
127a0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
127b0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
127c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
127d0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
127e0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
127f0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
12800 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
12810 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
12820 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
12830 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
12840 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
12850 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
12860 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
12870 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
12880 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
12890 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
128a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
128b0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
128c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
128d0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
128e0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
128f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12900 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
12910 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
12920 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
12930 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
12940 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12950 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
12960 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
12970 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
12980 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
12990 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
129a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
129b0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
129c0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
129d0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
129e0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
129f0 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
12a00 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
12a10 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
12a20 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
12a30 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
12a40 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
12a50 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
12a60 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
12a70 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
12a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12a90 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
12aa0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12ab0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
12ac0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
12ad0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
12ae0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
12af0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
12b00 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
12b10 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
12b20 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
12b30 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
12b40 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
12b50 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
12b60 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
12b70 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
12b80 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
12b90 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
12ba0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
12bb0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
12bc0 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
12bd0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
12be0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12c00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12c10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
12c20 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
12c30 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
12c40 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
12c50 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
12c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12c80 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
12c90 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
12cd0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
12ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
12cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12d00 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
12d10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12d30 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
12d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
12d60 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
12d70 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
12d80 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
12d90 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
12da0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
12db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12dc0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
12dd0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
12de0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
12df0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
12e00 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
12e10 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
12e20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12e30 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
12e40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
12e50 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
12e60 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12e70 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
12e80 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
12e90 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
12ea0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
12eb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
12ec0 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
12ed0 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
12ee0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
12ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
12f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f10 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
12f20 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
12f30 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
12f40 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
12f50 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
12f60 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
12f70 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
12f80 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
12f90 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
12fa0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
12fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
12fc0 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
12fd0 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
12ff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13000 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13030 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
13040 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13050 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
13060 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13080 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
130a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
130c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
130d0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
130e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
130f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
13100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13120 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13130 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
13140 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
13150 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
13160 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
13170 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
13180 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
13190 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
131a0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
131b0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
131c0 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
131d0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
131e0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
131f0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
13200 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
13210 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
13220 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
13230 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
13240 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
13250 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
13260 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
13270 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
13280 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
13290 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
132a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
132b0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
132c0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
132d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
132e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
132f0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
13300 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
13310 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
13320 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
13330 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
13340 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
13350 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
13360 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
13370 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
13380 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
13390 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
133a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
133b0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
133c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
133d0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
133e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
133f0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
13400 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13410 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
13420 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13430 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
13440 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
13450 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
13460 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
13470 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
13480 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13490 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
134a0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
134b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
134c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
134d0 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
134e0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
134f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13500 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
13510 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
13520 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
13530 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
13540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13560 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
13570 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
13580 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
13590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
135a0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
135b0 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
135c0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
135d0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
135e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
135f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
13600 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13620 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
13630 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
13640 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
13650 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
13660 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
13670 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
13680 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
13690 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
136a0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
136b0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
136c0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
136d0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
136e0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
136f0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
13700 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
13710 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
13720 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13730 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
13740 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13750 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
13760 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
13770 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13780 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
13790 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
137a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
137b0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
137c0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
137d0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
137e0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
137f0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
13800 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
13810 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
13820 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
13830 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
13840 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
13850 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
13860 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
13870 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
13880 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
13890 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
138a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
138b0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
138c0 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
138d0 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
138e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
138f0 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
13900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13910 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13920 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
13930 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
13940 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
13950 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13960 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
13970 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
13980 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
13990 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
139a0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
139b0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
139c0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
139d0 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
139e0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
139f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
13a00 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
13a10 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
13a20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
13a30 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
13a40 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
13a50 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
13a60 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
13a70 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
13a80 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
13a90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
13aa0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
13ab0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
13ac0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13ad0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
13ae0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
13af0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
13b00 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
13b10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13b20 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
13b30 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
13b40 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
13b50 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
13b60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
13b70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
13b80 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
13b90 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
13ba0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
13bb0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
13bc0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
13bd0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
13be0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
13bf0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
13c00 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
13c10 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
13c20 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
13c30 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
13c40 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
13c50 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13c60 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
13c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13c90 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
13ca0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
13cb0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
13cc0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13cd0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13ce0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13cf0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
13d00 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
13d10 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
13d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13d30 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
13d40 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
13d50 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
13d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
13d70 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13d80 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
13d90 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
13da0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
13db0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
13dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
13dd0 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
13de0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
13df0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
13e00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13e10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13e20 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
13e30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13e40 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
13e50 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
13e60 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
13e70 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
13e80 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
13e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13ea0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
13eb0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
13ec0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
13ed0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
13ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
13ef0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
13f00 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
13f10 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
13f20 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13f30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
13f40 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
13f50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f60 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
13f70 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
13f80 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
13f90 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
13fa0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13fb0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
13fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13fd0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
13fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13ff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14000 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
14010 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
14020 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
14030 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
14040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14050 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14060 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
14070 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
14080 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
14090 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
140a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
140b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
140c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
140d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
140e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
140f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14100 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14110 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14120 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14140 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14160 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
14170 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
14180 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
14190 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
141a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
141b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
141c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
141d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
141e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
141f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14200 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14210 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14220 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14230 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14240 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14250 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14260 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
14270 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14280 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
14290 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
142a0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
142b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
142c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
142d0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
142e0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
142f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14300 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
14310 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
14320 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
14330 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
14350 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
14360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14370 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14380 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
14390 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
143a0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
143b0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
143c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
143d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
143e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
143f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14400 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14420 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14430 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14440 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14460 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14470 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
144a0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
144b0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
144c0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
144d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
144e0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
144f0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14500 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14510 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14530 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14550 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14560 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14570 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
14580 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
14590 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
145a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
145b0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
145c0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
145d0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
145e0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
145f0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14600 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14610 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14620 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14630 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14640 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14650 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14670 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
14680 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
14690 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
146a0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
146b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
146c0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
146d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
146e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
146f0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14710 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14740 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14750 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14760 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
14770 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
14780 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
14790 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
147a0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
147b0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
147c0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
147d0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
147e0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
147f0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14800 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14810 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14820 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14830 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14840 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14860 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
14870 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
14880 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
14890 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
148a0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
148b0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
148c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
148d0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
148e0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
148f0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14900 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14910 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14920 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14930 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14940 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14950 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14960 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
14970 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
14980 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14990 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
149a0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
149b0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
149c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
149d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
149e0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
149f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14a00 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14a10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14a20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14a30 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14a40 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14a50 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14a60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
14a70 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
14a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14a90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14aa0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
14ab0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
14ac0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14ad0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14ae0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14b00 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14b10 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14b20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14b30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14b40 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14b50 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14b60 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14b70 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14b80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14b90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14ba0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14bb0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14bc0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14bd0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14be0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14bf0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14c00 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14c10 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14c20 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14c30 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14c40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14c50 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14c60 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14c70 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14c80 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14c90 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14ca0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14cb0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14cc0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14cd0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14ce0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14cf0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14d00 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14d10 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14d20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14d30 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14d40 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14d50 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14d60 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14d70 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14d80 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14d90 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14da0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14db0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14dc0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14dd0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14de0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14df0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14e00 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14e10 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14e20 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14e30 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14e40 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14e50 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14e60 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14e70 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14e80 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14e90 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14ea0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14eb0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14ec0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14ed0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14ee0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14ef0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14f00 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14f10 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14f20 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14f30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14f40 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14f50 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14f60 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14f70 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14f80 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14f90 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14fa0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14fb0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14fc0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14fd0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
14fe0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
14ff0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
15000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15010 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
15020 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
15030 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
15040 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
15050 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15060 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
15070 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
15080 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
15090 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
150a0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
150b0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
150c0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
150d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
150e0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
150f0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15100 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15110 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15130 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15140 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15150 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15170 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
15180 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
15190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
151a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
151b0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
151c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
151d0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
151e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
151f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15200 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15220 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15230 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15240 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15250 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15260 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
15270 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
15280 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
15290 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
152a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
152b0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
152c0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
152d0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
152e0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
152f0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15300 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15310 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15320 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15330 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15340 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15350 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15360 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
15370 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
15380 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
15390 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
153a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
153b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
153c0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
153d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
153e0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
153f0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15400 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15410 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15420 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15430 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15440 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15450 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15460 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
15470 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
15480 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
15490 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
154a0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
154b0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
154c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
154d0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
154e0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
154f0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15500 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15510 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15520 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15530 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15540 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15550 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15560 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
15570 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
15580 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
15590 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
155a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
155b0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
155c0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
155d0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
155e0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
155f0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15600 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15610 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15620 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15630 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15650 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15670 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
15680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
15690 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
156a0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
156b0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
156c0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
156d0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
156e0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
156f0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15700 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15710 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15720 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15750 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15760 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
15770 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
15780 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
15790 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
157a0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
157b0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
157c0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
157d0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
157e0 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
157f0 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15800 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15810 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15820 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15830 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15840 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15850 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15860 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
15870 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
15880 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15890 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
158a0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
158b0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
158c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
158d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
158e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
158f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15900 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15910 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15920 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15930 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15940 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15950 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15980 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
15990 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
159a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
159b0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
159c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
159d0 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
159e0 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
159f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15a00 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15a10 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15a20 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15a40 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15a50 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
15a70 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
15a80 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
15a90 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
15aa0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
15ab0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
15ac0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15ad0 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15ae0 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15af0 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15b00 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15b10 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15b20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15b30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15b40 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15b50 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15b60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15b70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15b80 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15b90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15ba0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15bb0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15bd0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15be0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15bf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15c00 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15c10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15c20 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15c30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15c40 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15c50 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15c60 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c80 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15c90 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15cb0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15cc0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15cd0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15ce0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15cf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15d00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15d10 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15d20 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15d30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15d40 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15d50 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15d60 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15d80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15da0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15db0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15dc0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15dd0 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15de0 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15df0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15e00 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15e10 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15e20 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15e30 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15e40 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15e50 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15e60 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15e70 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15e80 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15e90 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15ea0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15eb0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15ec0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15ed0 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15ee0 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15ef0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15f00 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15f10 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15f20 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15f30 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15f40 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15f50 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15f60 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15f70 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15f80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15f90 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15fa0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15fb0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15fc0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fe0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15ff0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
16000 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
16010 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16020 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16030 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16050 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16060 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16070 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16080 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16090 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
160a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
160b0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
160c0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
160d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
160e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
160f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16100 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
16110 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
16120 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
16130 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
16140 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
16150 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
16160 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
16170 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
16180 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
16190 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
161a0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
161b0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
161c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
161d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
161e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
161f0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16200 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
16210 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
16230 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
16240 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16250 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
16260 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
16270 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16280 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16290 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
162a0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
162b0 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
162c0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
162d0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
162e0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
162f0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
16300 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
16310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
16320 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
16330 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
16340 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
16350 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
16360 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
16370 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
16380 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
16390 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
163a0 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
163b0 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
163c0 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
163d0 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
163e0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
163f0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
16400 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
16410 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
16420 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
16430 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
16440 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
16450 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
16460 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
16470 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
16480 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
16490 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
164a0 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
164b0 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
164c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
164d0 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
164e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
164f0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
16500 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
16510 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16520 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
16530 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
16540 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
16550 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
16560 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
16570 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
16580 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
16590 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
165a0 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
165b0 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
165c0 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
165d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
165e0 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
165f0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
16600 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
16610 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
16620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16630 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
16640 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16650 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
16660 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
16670 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
16680 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16690 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
166a0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
166b0 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
166c0 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
166d0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
166e0 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
166f0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
16700 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16710 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
16720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
16730 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
16740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16750 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
16760 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
16770 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
16780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
16790 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
167a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
167b0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
167c0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
167d0 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
167e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
167f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16800 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
16810 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
16820 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
16830 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
16840 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
16850 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16860 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
16870 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
16880 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
16890 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
168a0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
168b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
168c0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
168d0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
168e0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
168f0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
16900 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
16910 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
16920 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
16930 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
16940 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
16950 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
16960 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16980 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
16990 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
169a0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
169b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
169c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
169d0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
169e0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
169f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16a00 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
16a10 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
16a20 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
16a30 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
16a40 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
16a50 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
16a60 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16a70 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
16a80 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
16a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
16aa0 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
16ab0 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
16ac0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
16ad0 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
16ae0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
16af0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
16b00 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
16b10 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
16b20 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
16b30 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
16b40 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
16b50 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
16b60 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
16b70 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
16b80 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
16b90 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
16ba0 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
16bb0 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
16bc0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16bd0 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
16be0 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
16bf0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
16c00 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16c10 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
16c20 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
16c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16c40 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
16c50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
16c60 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
16c70 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
16c80 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
16c90 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
16ca0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16cb0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
16cc0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16cd0 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
16ce0 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
16cf0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
16d00 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
16d10 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
16d20 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
16d30 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
16d40 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
16d50 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
16d60 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
16d70 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
16d80 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
16d90 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
16da0 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
16db0 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
16dc0 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
16dd0 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
16de0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16df0 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
16e00 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
16e10 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16e20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e30 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
16e40 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16e50 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
16e60 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16e70 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
16e80 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16e90 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
16ea0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
16eb0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
16ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ed0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
16ee0 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
16ef0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
16f00 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
16f10 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
16f20 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
16f30 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
16f40 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
16f50 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
16f60 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
16f70 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
16f80 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
16f90 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
16fa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16fb0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
16fc0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16fd0 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
16fe0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16ff0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
17000 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
17010 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
17020 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
17030 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17040 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
17050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
17060 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
17070 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
17080 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
17090 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
170a0 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
170b0 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
170c0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
170d0 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
170e0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
170f0 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
17100 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
17110 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
17120 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
17130 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
17140 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
17150 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
17160 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17170 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
17180 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
17190 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
171a0 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
171b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
171c0 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
171d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
171e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
171f0 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
17200 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17210 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
17220 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
17230 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17240 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
17250 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17260 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
17270 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
17280 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
17290 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
172a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
172b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
172c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
172d0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
172e0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
172f0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
17300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
17310 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
17320 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
17330 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
17340 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17350 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
17360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17370 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
17380 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
17390 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
173a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
173b0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
173c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
173d0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
173e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
173f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17400 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
17410 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
17420 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17440 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17450 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17460 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
17470 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
17480 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
17490 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
174a0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
174b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
174c0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
174d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
174e0 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
174f0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17500 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17510 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
17520 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17530 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
17540 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17550 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
17560 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
17570 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
17580 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
17590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
175a0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
175b0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
175c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
175d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
175e0 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
175f0 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
17600 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
17610 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17620 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
17630 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
17640 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
17650 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
17660 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
17670 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17680 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
17690 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
176a0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
176b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
176c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
176d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
176e0 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
176f0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
17700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17710 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
17720 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
17730 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
17740 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
17750 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17760 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
17770 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
17780 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
17790 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
177a0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
177b0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
177c0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
177d0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
177e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
177f0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
17800 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
17810 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
17820 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
17830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
17840 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
17850 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
17860 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17870 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
17880 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
17890 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
178a0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
178b0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
178c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
178d0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
178e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
178f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
17900 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17910 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
17920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17930 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17940 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
17950 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
17960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17970 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
17980 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
17990 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
179a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
179b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
179c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
179d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
179e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
179f0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
17a00 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
17a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17a20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17a30 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17a40 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
17a50 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
17a60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17a70 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
17a80 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
17a90 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
17aa0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
17ab0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
17ac0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
17ad0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
17ae0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
17af0 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
17b00 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
17b10 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
17b20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17b30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
17b40 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
17b50 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
17b60 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
17b70 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
17b80 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
17b90 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
17ba0 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
17bb0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17bc0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
17bd0 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
17be0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
17bf0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
17c00 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
17c10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
17c20 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
17c30 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
17c40 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
17c50 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17c60 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
17c70 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
17c80 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
17c90 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
17ca0 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
17cb0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
17cc0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
17cd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
17ce0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
17cf0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
17d00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17d10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17d20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
17d30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
17d40 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
17d50 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
17d60 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17d70 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
17d80 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17d90 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
17da0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17db0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
17dc0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
17dd0 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
17de0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17df0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
17e00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
17e10 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
17e20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17e30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
17e50 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
17e60 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
17e70 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
17e80 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
17e90 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
17ea0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
17eb0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
17ec0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
17ed0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
17ee0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
17ef0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
17f00 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
17f10 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
17f20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
17f30 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
17f40 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
17f50 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
17f60 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
17f70 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
17f80 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
17f90 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
17fa0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
17fb0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
17fc0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
17fd0 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
17fe0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
17ff0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
18000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
18010 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
18020 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18030 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
18040 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
18050 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
18060 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
18070 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
18080 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
18090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
180a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
180b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
180c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
180d0 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
180e0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
180f0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41  E_DEFAULT_WAL_SA
18100 46 45 54 59 4c 45 56 45 4c 0a 20 20 20 20 20 20  FETYLEVEL.      
18110 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 74 6f 20    /* Default to 
18120 73 70 65 63 69 66 69 65 64 20 73 61 66 65 74 79  specified safety
18130 5f 6c 65 76 65 6c 20 66 6f 72 20 57 41 4c 20 6d  _level for WAL m
18140 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ode */.        i
18150 66 28 20 70 42 74 2d 3e 64 62 21 3d 30 20 26 26  f( pBt->db!=0 &&
18160 20 70 42 74 2d 3e 64 62 2d 3e 61 44 62 21 3d 30   pBt->db->aDb!=0
18170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
18180 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
18190 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
181a0 42 74 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  Bt->db;.        
181b0 20 20 44 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e    Db *aDb = db->
181c0 61 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 75  aDb;.          u
181d0 38 20 6c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 20  8 level = 0;.   
181e0 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30         for(iDb=0
181f0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
18200 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Db++){.         
18210 20 20 20 69 66 28 20 61 44 62 5b 69 44 62 5d 2e     if( aDb[iDb].
18220 70 42 74 20 26 26 20 61 44 62 5b 69 44 62 5d 2e  pBt && aDb[iDb].
18230 70 42 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 20  pBt->pBt==pBt ) 
18240 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
18260 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
18270 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   );.          le
18280 76 65 6c 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  vel = db->aDb[iD
18290 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b  b].safety_level;
182a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
182b0 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c  SQLITE_DbSafetyL
182c0 65 76 65 6c 49 73 46 69 78 65 64 28 6c 65 76 65  evelIsFixed(leve
182d0 6c 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  l) && .         
182e0 20 20 20 20 28 53 51 4c 49 54 45 5f 44 62 53 61      (SQLITE_DbSa
182f0 66 65 74 79 4c 65 76 65 6c 56 61 6c 75 65 28 6c  fetyLevelValue(l
18300 65 76 65 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f  evel) != SQLITE_
18310 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
18320 54 59 4c 45 56 45 4c 29 20 29 7b 0a 20 20 20 20  TYLEVEL) ){.    
18330 20 20 20 20 20 20 20 20 61 44 62 5b 69 44 62 5d          aDb[iDb]
18340 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
18350 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18360 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 3b 0a  AL_SAFETYLEVEL;.
18370 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18380 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
18390 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
183a0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
183b0 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
183c0 45 4c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EL, .           
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
183f0 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 75  >flags&SQLITE_Fu
18400 6c 6c 46 53 79 6e 63 29 21 3d 30 2c 0a 20 20 20  llFSync)!=0,.   
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
18440 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53  QLITE_CkptFullFS
18450 79 6e 63 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ync)!=0);.      
18460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18470 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
18480 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18490 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
184a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
184c0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
184d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
184e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
184f0 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
18500 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
18510 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
18520 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
18530 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
18540 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
18550 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
18560 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
18570 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
18580 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
18590 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
185a0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
185b0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
185c0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
185d0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
185e0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
185f0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
18600 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
18610 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
18620 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
18630 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18640 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18650 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
18660 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
18670 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
18680 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
18690 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
186a0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
186b0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
186c0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
186d0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
186e0 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
186f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18710 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
18720 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
18730 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
18740 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
18750 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
18760 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
18770 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
18780 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
18790 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
187a0 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
187b0 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
187c0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
187d0 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
187e0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
187f0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
18800 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
18810 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
18820 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18830 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18840 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18850 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18860 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
18870 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
18880 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
18890 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
188a0 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
188b0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
188c0 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
188d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
188e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
188f0 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
18900 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
18910 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
18920 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
18930 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
18940 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
18950 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
18960 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
18970 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
18980 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
18990 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
189a0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
189b0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
189c0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
189d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
189e0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
189f0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
18a00 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
18a10 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
18a20 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
18a30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
18a40 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
18a50 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
18a60 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18a70 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
18a80 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
18a90 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
18aa0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
18ab0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
18ac0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
18ad0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
18ae0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
18af0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
18b00 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
18b10 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
18b20 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18b30 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
18b40 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
18b50 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
18b60 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
18b70 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
18b80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18b90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
18ba0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
18bb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18bc0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
18bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18be0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
18bf0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
18c00 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
18c10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
18c20 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
18c30 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
18c40 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
18c70 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
18c80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18c90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
18ca0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
18cb0 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
18cc0 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
18cd0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
18ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
18cf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18d00 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18d10 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18d20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18d30 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
18d40 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
18d50 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
18d60 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
18d70 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
18d80 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
18d90 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
18da0 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
18db0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
18dc0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
18dd0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
18de0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
18df0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
18e00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18e10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e20 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
18e30 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
18e40 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
18e50 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
18e60 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
18e70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
18e80 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
18e90 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
18ea0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
18eb0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
18ec0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
18ed0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
18ee0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
18ef0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
18f00 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
18f10 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
18f20 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
18f30 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
18f40 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
18f50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
18f60 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
18f70 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
18f80 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
18f90 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
18fa0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
18fb0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
18fc0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
18fd0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
18fe0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
18ff0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
19000 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
19010 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19020 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
19030 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
19040 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
19050 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
19060 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
19070 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
19080 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
19090 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
190a0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
190b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
190c0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
190d0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
190e0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
190f0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
19100 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
19110 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
19120 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
19130 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
19140 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
19150 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
19160 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
19170 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
19180 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
19190 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
191a0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
191b0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
191c0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
191d0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
191e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
191f0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
19200 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
19210 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
19220 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
19230 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
19240 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
19250 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
19260 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
19270 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
19280 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
19290 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
192a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
192b0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
192c0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
192d0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
192e0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
192f0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
19300 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
19310 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
19320 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
19330 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
19340 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
19350 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
19360 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
19370 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
19380 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19390 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
193a0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
193b0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
193c0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
193d0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
193e0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
193f0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
19400 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
19410 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
19420 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
19430 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
19440 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
19450 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
19460 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
19470 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
19480 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
19490 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
194a0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
194b0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
194c0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
194d0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
194e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
194f0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
19500 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
19510 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
19520 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
19530 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
19540 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
19550 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
19560 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
19570 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
19580 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
19590 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
195a0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
195b0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
195c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
195d0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
195e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
195f0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
19600 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
19610 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
19620 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
19630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
19640 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19650 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
19660 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
19670 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
19680 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
19690 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
196a0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
196b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
196c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
196d0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
196e0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
196f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
19710 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
19720 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
19730 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
19740 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
19750 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
19760 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
19770 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19780 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
19790 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
197a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
197b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
197c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
197d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
197e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
197f0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
19800 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
19810 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
19820 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
19830 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
19840 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19850 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
19860 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
19870 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19880 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
19890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
198a0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
198b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
198c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
198d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
198e0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
198f0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
19900 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
19910 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
19920 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
19930 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
19940 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
19950 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
19960 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
19970 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
19980 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
19990 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
199a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
199b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
199c0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
199d0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
199e0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
199f0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
19a00 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19a10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19a20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19a30 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
19a40 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
19a70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
19a80 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
19a90 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
19aa0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
19ab0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
19ac0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
19ad0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19ae0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
19af0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19b00 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
19b10 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
19b20 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19b30 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
19b40 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
19b50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
19b60 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
19b70 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
19b80 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
19b90 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
19ba0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
19bb0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
19bc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
19bd0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
19be0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
19bf0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
19c00 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
19c10 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
19c20 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
19c30 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
19c40 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
19c50 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
19c60 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
19c70 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
19c80 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
19c90 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
19ca0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
19cb0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
19cc0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
19cd0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
19ce0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
19cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19d00 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
19d10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
19d20 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
19d30 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
19d40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
19d50 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
19d60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
19d70 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
19d80 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
19d90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
19da0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
19db0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
19dc0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
19dd0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
19de0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
19df0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
19e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19e10 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
19e20 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19e30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19e40 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
19e50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
19e60 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
19e70 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
19e80 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
19e90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19ea0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
19eb0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
19ec0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
19ed0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
19ee0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
19ef0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19f00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
19f10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
19f20 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
19f30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
19f40 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
19f50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19f60 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
19f80 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
19f90 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
19fa0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
19fb0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
19fc0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
19fd0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
19fe0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
19ff0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1a000 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1a010 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1a020 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1a030 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1a040 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1a050 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1a060 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1a070 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1a080 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a090 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1a0a0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1a0b0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1a0c0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1a0d0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1a0e0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1a0f0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1a100 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1a110 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1a120 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1a130 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1a140 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1a150 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1a160 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1a170 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1a180 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1a190 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1a1a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1a1b0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1a1c0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1a1d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a1e0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1a1f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a200 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1a210 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1a220 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1a230 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a240 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1a250 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1a260 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1a270 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1a280 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1a290 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1a2a0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1a2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a2c0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1a2d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1a2e0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1a2f0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1a300 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1a310 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1a320 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1a330 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1a340 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1a350 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1a360 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1a370 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1a380 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1a390 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1a3a0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1a3b0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1a3c0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1a3d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1a3e0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1a3f0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1a400 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1a410 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1a420 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1a430 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1a440 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1a450 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1a460 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1a470 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1a480 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1a490 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1a4a0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1a4b0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1a4c0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1a4d0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1a4e0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1a4f0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1a500 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1a510 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1a520 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1a530 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1a540 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1a550 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1a560 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1a570 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1a580 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1a590 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1a5a0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1a5b0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1a5c0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1a5d0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1a5e0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1a5f0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1a600 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1a610 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1a620 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1a630 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1a640 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a650 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1a660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a670 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a680 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1a690 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1a6a0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1a6b0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1a6c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a6d0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1a6e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1a6f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1a700 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1a710 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1a720 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1a730 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1a740 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a750 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1a760 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1a770 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1a780 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1a790 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a7a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1a7b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a7c0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1a7d0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1a7e0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1a7f0 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1a800 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1a810 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1a820 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1a830 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1a840 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a850 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1a860 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1a870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1a880 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1a890 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a8a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a8b0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a8c0 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1a8d0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1a8e0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1a8f0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1a900 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1a910 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1a920 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1a930 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1a940 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1a950 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1a960 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a970 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1a980 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1a990 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1a9a0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1a9b0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1a9c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a9d0 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1a9e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a9f0 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1aa00 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1aa10 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1aa20 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1aa30 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1aa40 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1aa50 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1aa60 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1aa70 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1aa80 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1aa90 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1aaa0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1aab0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1aac0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1aad0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1aae0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ab00 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1ab10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1ab20 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1ab30 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1ab40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ab50 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1ab60 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1ab70 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1ab80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ab90 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1aba0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1abb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1abc0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1abd0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1abe0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1abf0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1ac00 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1ac10 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1ac20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1ac30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ac40 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1ac50 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1ac60 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ac70 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1ac80 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1ac90 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1aca0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1acb0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1acc0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1acd0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1ace0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1acf0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1ad00 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1ad10 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1ad20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1ad30 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1ad40 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1ad50 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1ad60 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1ad70 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1ad80 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1ad90 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1ada0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1adb0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1adc0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1add0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1ade0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1adf0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1ae00 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1ae10 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1ae20 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1ae30 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1ae40 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1ae50 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1ae60 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1ae70 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1ae80 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1ae90 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1aea0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1aeb0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1aec0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1aed0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1aee0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1aef0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1af00 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1af10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1af20 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1af30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1af40 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1af50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1af60 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1af70 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1af80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1af90 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1afa0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1afb0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1afc0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1afd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1afe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aff0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1b000 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1b010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b020 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1b030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b040 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1b050 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1b060 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1b070 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1b080 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1b090 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b0a0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1b0b0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1b0c0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1b0d0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1b0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b0f0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1b100 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1b110 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1b120 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1b130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b140 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1b150 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1b160 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1b170 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1b180 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1b190 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1b1a0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1b1b0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1b1c0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1b1d0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1b1e0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1b1f0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1b200 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1b210 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1b220 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1b230 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1b240 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1b250 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1b260 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1b270 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1b280 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b290 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1b2a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1b2b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1b2c0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1b2d0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1b2e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b2f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1b300 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1b310 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1b320 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1b330 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1b340 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1b350 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1b360 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1b370 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b380 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1b390 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1b3a0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1b3b0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1b3c0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1b3d0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1b3e0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1b3f0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1b400 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1b410 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1b420 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1b430 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1b440 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1b450 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1b460 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1b470 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1b480 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1b490 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1b4a0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1b4b0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1b4c0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1b4d0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1b4e0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1b4f0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1b500 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1b510 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1b520 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1b530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1b540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1b550 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1b560 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1b570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1b590 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1b5a0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1b5b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1b5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b5d0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1b5e0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1b5f0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1b600 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1b610 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1b620 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1b630 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1b640 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1b650 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1b660 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1b670 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1b680 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1b690 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1b6a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1b6b0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1b6c0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1b6d0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1b6e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b6f0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1b700 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1b710 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1b720 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1b730 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1b740 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b750 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b760 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1b770 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b780 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1b790 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1b7a0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1b7b0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1b7c0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1b7d0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1b7e0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1b7f0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1b800 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1b810 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1b820 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1b830 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1b840 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1b850 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1b860 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1b870 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1b8a0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1b8b0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b8e0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1b8f0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1b900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b920 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1b930 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b940 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
1b950 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1b960 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1b970 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1b980 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1b990 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b9a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1b9b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1b9c0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1b9d0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1b9e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b9f0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
1ba00 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
1ba10 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
1ba20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1ba30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1ba40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1ba50 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1ba60 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1ba70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1ba80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1ba90 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1baa0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1bab0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1bac0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1bad0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1bae0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1baf0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1bb00 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1bb10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1bb20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1bb30 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1bb40 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1bb50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1bb60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1bb70 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1bb80 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1bb90 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1bba0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1bbb0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
1bbc0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
1bbd0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1bbe0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
1bbf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1bc00 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1bc10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1bc20 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1bc30 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1bc40 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1bc50 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1bc60 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1bc70 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1bc80 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1bc90 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1bca0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1bcb0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1bcc0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1bcd0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1bce0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1bcf0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1bd10 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1bd20 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1bd30 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1bd40 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1bd50 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1bd60 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1bd90 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1bda0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1bdb0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bdc0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1bdd0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1bde0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1bdf0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1be00 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1be10 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1be20 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1be30 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1be40 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1be50 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1be60 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1be70 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1be80 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1be90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1bea0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1beb0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1bec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1bed0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1bee0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1bef0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1bf00 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1bf10 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1bf20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1bf30 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1bf40 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1bf50 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1bf60 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1bf70 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1bf80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bf90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bfa0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1bfb0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1bfc0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1bfd0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
1bfe0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1bff0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
1c000 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1c010 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1c020 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
1c030 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1c040 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c050 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1c060 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1c070 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c080 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1c090 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1c0a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1c0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1c0c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c0d0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1c0e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1c0f0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1c100 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1c110 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1c120 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1c130 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1c140 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26 26  load.         &&
1c150 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
1c160 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  e-1<=pPage->aDat
1c170 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
1c180 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
1c190 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1c1a0 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1c1b0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1c1c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1c1d0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1c1e0 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1c1f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c200 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c210 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1c220 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1c230 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1c240 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1c250 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1c260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c280 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1c290 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1c2a0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c2b0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1c2c0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1c2d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c2e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1c2f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1c300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c320 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1c330 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1c340 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1c350 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1c360 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1c370 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1c380 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1c390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c3a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1c3b0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1c3c0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1c3d0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1c3e0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1c3f0 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1c400 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1c410 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1c420 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1c430 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1c440 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1c450 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1c460 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1c470 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1c480 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1c490 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1c4a0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1c4b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1c4c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1c4d0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1c4e0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1c4f0 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1c500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c510 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1c520 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1c530 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1c540 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1c550 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1c560 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1c570 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1c580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c590 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1c5a0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1c5b0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c5c0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1c5d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c5e0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1c5f0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c600 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1c610 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1c620 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1c630 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1c640 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1c650 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1c660 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1c670 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1c680 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1c690 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1c6a0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1c6b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1c6c0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1c6d0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1c6e0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1c6f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1c700 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c710 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1c720 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1c730 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1c740 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1c750 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c760 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1c770 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c780 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c790 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c7b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c7c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c7d0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1c7e0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1c7f0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1c800 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1c810 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1c820 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1c830 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1c840 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1c850 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1c860 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1c870 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1c880 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1c890 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c8a0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1c8b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c8c0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1c8d0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1c8e0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1c8f0 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c910 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c920 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c930 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c940 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c950 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c960 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c970 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c980 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c990 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c9a0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c9b0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c9c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c9d0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c9e0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c9f0 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1ca00 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1ca10 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1ca20 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1ca30 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1ca40 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1ca50 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1ca60 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1ca70 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1ca80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1ca90 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1caa0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1cab0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1cac0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1cad0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1cae0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1caf0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1cb00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1cb10 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1cb20 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1cb30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cb40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cb50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1cb60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1cb70 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1cb80 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1cb90 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1cba0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1cbb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1cbc0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1cbd0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1cbe0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1cbf0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1cc00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cc20 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1cc30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1cc40 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1cc50 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1cc60 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1cc70 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1cc80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1cc90 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1cca0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1ccb0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1ccc0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1ccd0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1cce0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1ccf0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1cd00 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1cd10 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1cd20 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1cd30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cd40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cd50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cd60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cd70 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1cd80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1cd90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cda0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1cdb0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1cdc0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1cdd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1cde0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1cdf0 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1ce00 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1ce10 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1ce20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ce30 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1ce40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ce50 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1ce60 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1ce70 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1ce80 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1ce90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cea0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1ceb0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1cec0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1ced0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1cee0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1cef0 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1cf00 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1cf10 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1cf20 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1cf30 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1cf40 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1cf50 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1cf60 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1cf70 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1cf80 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1cf90 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1cfa0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1cfb0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1cfc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1cfd0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1cfe0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1cff0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1d000 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1d010 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1d020 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1d030 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1d040 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1d050 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1d060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1d070 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1d080 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1d090 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1d0a0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1d0b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1d0c0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1d0d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d0e0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1d0f0 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1d100 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1d110 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1d120 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1d130 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1d140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1d150 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1d160 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1d170 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1d180 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1d190 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1d1a0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1d1b0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1d1c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1d1d0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1d1e0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1d1f0 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1d200 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1d210 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1d220 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1d230 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1d240 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1d250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1d260 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1d270 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1d280 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1d290 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1d2a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1d2b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1d2c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1d2d0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1d2e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1d2f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d300 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d310 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1d330 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1d340 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1d350 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1d360 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1d370 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d380 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1d390 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1d3a0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1d3b0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1d3c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1d3d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1d3e0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1d3f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d400 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d410 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1d420 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1d430 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1d440 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1d450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d460 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1d480 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d490 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1d4a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d4c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1d4d0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1d4e0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1d4f0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d500 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1d510 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1d520 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1d530 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1d540 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1d550 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1d560 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1d570 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1d580 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1d590 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1d5a0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1d5b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d5c0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1d5d0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1d5e0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1d5f0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1d600 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1d610 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1d620 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1d630 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1d640 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d660 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d670 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d680 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1d690 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d6b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d6c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d6d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1d6f0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1d700 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1d710 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1d730 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1d740 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1d750 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d760 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1d770 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1d780 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d790 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1d7a0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1d7b0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1d7c0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d7d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d7e0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1d7f0 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1d800 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1d810 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d820 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d830 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1d840 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d850 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1d860 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1d870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d880 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d890 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d8a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1d8b0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1d8c0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1d8d0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1d8e0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1d8f0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d900 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d910 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d920 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d930 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d940 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d950 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d960 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d970 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d980 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d990 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d9a0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d9b0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d9c0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d9d0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d9e0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d9f0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1da00 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1da10 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1da20 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1da30 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1da40 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1da50 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1da60 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1da70 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1da80 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1da90 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1daa0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1dab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1dac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dad0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dae0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1daf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1db00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1db10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1db20 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1db30 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1db40 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1db50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1db60 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1db70 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1db80 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1db90 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1dba0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1dbb0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1dbc0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1dbd0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1dbe0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dbf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dc10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dc20 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1dc30 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1dc40 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1dc50 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1dc60 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1dc70 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1dc80 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1dc90 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1dca0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1dcb0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1dcc0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1dcd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dce0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1dcf0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1dd00 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1dd10 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1dd20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1dd30 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1dd40 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1dd50 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1dd60 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1dd70 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1dd80 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1dd90 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1dda0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1ddb0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1ddc0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1ddd0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1dde0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1ddf0 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1de00 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1de10 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1de20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1de30 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1de40 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1de50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1de60 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1de70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1de80 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1de90 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1dea0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1ded0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1dee0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1def0 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1df00 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1df10 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1df20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1df30 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1df40 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1df50 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1df60 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1df70 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1df80 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1df90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1dfa0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1dfb0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1dfc0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1dfd0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1dfe0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dff0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1e000 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1e010 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1e020 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1e030 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1e040 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1e050 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1e060 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1e070 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1e080 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1e090 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1e0a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1e0b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1e0c0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1e0d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1e0e0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1e0f0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1e100 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1e110 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1e120 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1e130 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1e140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1e150 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1e160 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1e170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e180 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1e190 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1e1a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1e1b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1e1c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e1d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1e1e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1e1f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1e200 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1e210 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1e220 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1e230 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1e240 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1e250 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1e260 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e270 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e280 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1e290 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e2a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e2b0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1e2c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1e2d0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1e2e0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1e2f0 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1e300 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1e310 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1e320 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1e330 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1e340 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1e360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e370 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1e380 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1e390 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1e3a0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1e3b0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1e3c0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1e3d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1e3e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e3f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e400 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e410 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e420 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1e430 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e440 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1e450 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1e460 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e470 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e480 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1e490 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1e4a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1e4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e4d0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1e4e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e4f0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1e500 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1e510 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1e520 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1e540 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e550 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1e560 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1e570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1e580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e590 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1e5a0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1e5b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1e5c0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1e5d0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1e5e0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1e5f0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1e600 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1e610 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1e620 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1e630 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1e640 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1e650 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1e660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e670 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e680 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1e690 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1e6a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e6b0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1e6c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e6d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e6e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1e6f0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e700 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e710 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1e720 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1e730 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1e740 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1e750 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1e760 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e770 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1e780 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1e790 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1e7a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1e7b0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e7c0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1e7d0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1e7e0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1e7f0 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1e800 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1e810 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1e820 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e830 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1e840 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1e850 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e860 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e870 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1e880 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1e890 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1e8a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e8b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1e8c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1e8d0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1e8e0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1e8f0 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e900 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e910 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e920 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e930 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e940 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e950 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e960 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e970 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e980 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e9a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e9b0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e9c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e9d0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e9e0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e9f0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1ea00 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1ea10 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1ea20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea30 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1ea40 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1ea50 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1ea60 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1ea70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1ea80 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1ea90 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1eaa0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1eab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1eac0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1ead0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1eae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eaf0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1eb00 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1eb10 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1eb20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1eb30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1eb40 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1eb50 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1eb60 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1eb70 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1eb80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1eb90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1eba0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1ebb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ebc0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ebd0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1ebe0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ebf0 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1ec00 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1ec10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ec20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ec30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ec40 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1ec50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1ec60 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1ec70 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1ec80 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1ec90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1eca0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1ecb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1ecc0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1ecd0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1ece0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1ecf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1ed00 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1ed10 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1ed20 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1ed30 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1ed40 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1ed50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ed60 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1ed70 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1ed80 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1ed90 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1eda0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1edb0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1edc0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1edd0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1ede0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1edf0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1ee00 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1ee10 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1ee20 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1ee30 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1ee40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1ee50 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1ee60 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1ee70 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1ee80 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1ee90 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1eea0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1eeb0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1eec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1eed0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1eee0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1eef0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1ef00 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1ef10 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1ef20 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1ef30 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1ef40 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1ef50 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1ef60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ef70 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1ef80 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1ef90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1efa0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1efb0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1efc0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1efd0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1efe0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1eff0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1f000 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1f010 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1f020 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1f030 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1f040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1f050 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1f060 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1f070 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1f080 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1f090 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1f0a0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1f0b0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1f0c0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1f0d0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1f0e0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1f0f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f100 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1f110 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1f120 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1f130 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1f140 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1f150 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1f160 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1f170 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1f180 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1f190 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1f1a0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1f1b0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1f1c0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1f1d0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1f1e0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1f1f0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1f200 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1f210 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1f220 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1f230 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1f240 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1f250 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f260 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1f270 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1f280 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1f290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f2a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1f2b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1f2c0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1f2d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1f2e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f2f0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1f300 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f310 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1f320 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f330 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1f340 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1f350 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f380 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1f390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f3a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f3b0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1f3c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1f3d0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1f3e0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1f3f0 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1f400 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f420 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1f430 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1f440 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1f450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f460 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1f470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f480 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f490 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1f4a0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1f4b0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1f4c0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1f4d0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1f4e0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1f4f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f500 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1f510 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1f520 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f530 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1f540 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1f550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f560 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1f570 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1f580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f590 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1f5a0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1f5b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1f5c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1f5d0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1f5e0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1f5f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1f600 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1f610 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1f620 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1f630 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1f640 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1f650 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f660 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1f670 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1f680 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1f690 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1f6a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1f6b0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1f6c0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f6d0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1f6e0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f6f0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1f700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1f710 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1f720 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1f730 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1f740 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1f750 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1f760 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1f770 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1f780 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1f790 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1f7a0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1f7b0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1f7c0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1f7d0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1f7e0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1f7f0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1f800 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1f810 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1f820 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1f830 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1f840 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f850 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1f860 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1f870 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1f880 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1f890 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1f8a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1f8b0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1f8c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f8d0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1f8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1f8f0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f900 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f910 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f920 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f930 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f940 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f950 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f960 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f970 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f980 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f990 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f9a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f9b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f9c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f9d0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f9e0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f9f0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1fa00 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1fa10 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1fa20 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1fa30 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1fa40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1fa50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1fa60 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1fa70 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1fa80 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1fa90 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1faa0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1fab0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fac0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1fad0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1fae0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1faf0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1fb00 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1fb10 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1fb20 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1fb30 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1fb40 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1fb50 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1fb60 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1fb70 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1fb80 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1fb90 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1fba0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1fbb0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1fbc0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1fbd0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1fbe0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1fbf0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1fc00 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1fc10 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1fc20 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1fc30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1fc40 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1fc50 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1fc60 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1fc70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1fc80 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1fc90 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1fca0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1fcb0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1fcc0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1fcd0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1fce0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1fcf0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1fd00 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1fd10 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1fd20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1fd30 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1fd40 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1fd50 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1fd60 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1fd70 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1fd80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1fd90 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1fda0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1fdb0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1fdc0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1fdd0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1fde0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1fdf0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1fe00 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1fe10 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1fe20 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1fe30 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1fe40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1fe50 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1fe60 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1fe70 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1fe80 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1fe90 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1fea0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1feb0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1fec0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1fed0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fee0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1fef0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1ff00 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1ff10 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1ff20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1ff30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ff40 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1ff50 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1ff60 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1ff70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ff80 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1ff90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1ffa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ffb0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1ffc0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1ffd0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1ffe0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1fff0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
20000 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
20010 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
20020 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
20030 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
20040 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
20050 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
20060 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20070 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
20080 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
20090 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
200a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
200b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
200c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
200d0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
200e0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
200f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20100 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
20110 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
20120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20130 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
20140 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
20150 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20160 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
20170 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
20180 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
20190 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
201a0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
201b0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
201c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
201d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
201e0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
201f0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
20200 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
20210 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
20220 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20230 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20250 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
20260 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
20270 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
20280 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
20290 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
202a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
202b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
202c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
202d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
202e0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
202f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20300 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20310 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
20320 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
20330 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20340 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20350 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20360 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
20370 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
20380 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
20390 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
203a0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
203b0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
203c0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
203d0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
203e0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
203f0 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
20400 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
20410 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
20420 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
20430 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
20440 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
20450 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
20460 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
20470 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
20480 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
20490 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
204a0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
204b0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
204c0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
204d0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
204e0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
204f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20500 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
20510 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
20520 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
20530 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
20540 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
20550 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
20560 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
20570 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
20580 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
20590 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
205a0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
205b0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
205c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
205d0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
205e0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
205f0 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
20600 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
20610 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
20620 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
20630 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
20640 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
20650 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
20660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20670 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
20680 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
20690 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
206a0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
206b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
206c0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
206d0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
206e0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
206f0 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
20700 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
20710 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
20720 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
20730 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20740 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
20750 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
20760 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
20770 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
20780 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
20790 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
207a0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
207b0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
207c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
207d0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
207e0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
207f0 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
20800 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
20810 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
20820 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
20830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20840 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20850 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
20860 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
20870 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
20880 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
20890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208a0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
208b0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
208c0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
208d0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
208e0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
208f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
20900 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
20910 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
20920 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
20930 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20940 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
20950 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
20960 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
20970 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
20980 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
20990 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
209a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
209b0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
209c0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
209d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
209e0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
209f0 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
20a00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20a20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
20a30 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20a40 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
20a50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20a70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20aa0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
20ab0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
20ac0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
20ad0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
20ae0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
20af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20b00 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
20b10 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
20b30 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20b40 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
20b50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20b70 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20b80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
20ba0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
20bb0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
20bc0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
20bd0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
20be0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
20bf0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20c00 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20c10 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20c20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20c30 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20c40 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
20c50 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
20c60 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20c70 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
20c80 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
20c90 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
20ca0 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
20cb0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
20cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
20cd0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
20ce0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
20cf0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20d00 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20d10 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20d20 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20d30 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
20d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20d50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
20d60 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
20d70 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20d80 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
20d90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20da0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
20db0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
20dc0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
20dd0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
20de0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20df0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20e00 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20e10 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20e20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20e40 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
20e50 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
20e60 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
20e70 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
20e80 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20e90 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
20ea0 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
20eb0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
20ec0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
20ed0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
20ee0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
20ef0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20f00 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20f10 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20f20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20f30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
20f40 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
20f50 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
20f60 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20f70 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
20f80 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
20f90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
20fa0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
20fb0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
20fc0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
20fd0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
20fe0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
20ff0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
21000 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
21010 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
21020 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
21030 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
21040 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
21050 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
21060 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
21070 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
21080 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
21090 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
210a0 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
210b0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
210c0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
210d0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
210e0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
210f0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
21100 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
21110 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
21120 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
21130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
21140 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
21150 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
21160 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
21170 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
21180 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
21190 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
211a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
211b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
211c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
211d0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
211e0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
211f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
21200 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
21210 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
21220 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21230 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
21240 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
21250 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
21260 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
21270 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
21280 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
21290 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
212a0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
212b0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
212c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
212d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
212e0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
212f0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
21300 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
21310 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
21320 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
21330 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
21340 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
21350 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
21360 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
21370 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
21380 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
21390 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
213a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
213b0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
213c0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
213d0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
213e0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
213f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
21400 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
21410 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
21420 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
21430 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
21440 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
21450 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
21460 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
21470 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
21480 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
21490 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
214a0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
214b0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
214c0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
214d0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
214e0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
214f0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
21500 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
21510 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
21520 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
21530 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
21540 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
21550 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21560 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
21570 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
21580 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
21590 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
215a0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
215b0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
215c0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
215d0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
215e0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
215f0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
21600 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
21610 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
21620 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
21630 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
21640 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
21650 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
21660 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
21670 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
21680 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
21690 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
216a0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
216b0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
216c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
216d0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
216e0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
216f0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
21700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21710 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
21720 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
21740 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21750 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21760 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21770 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
21780 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21790 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
217a0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
217b0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
217c0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
217d0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
217e0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
217f0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
21800 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
21810 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21820 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
21830 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
21840 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
21850 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
21860 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
21870 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
21880 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
21890 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
218a0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
218b0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
218c0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
218d0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
218e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
218f0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
21900 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
21910 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
21920 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
21930 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21940 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
21950 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21960 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
21980 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
21990 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
219a0 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
219b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
219c0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
219d0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
219e0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
219f0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
21a00 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
21a10 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
21a20 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
21a30 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
21a40 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
21a50 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
21a60 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21a70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
21a80 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
21a90 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
21aa0 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
21ab0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21ac0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
21ad0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
21ae0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
21af0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
21b00 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
21b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
21b20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
21b30 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
21b40 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
21b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
21b60 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
21b70 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
21b80 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
21b90 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
21ba0 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
21bb0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21bc0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
21bd0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
21be0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
21bf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21c00 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21c10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21c20 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21c30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
21c40 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
21c50 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
21c60 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
21c70 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
21c80 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
21c90 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
21ca0 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
21cb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21cc0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
21cd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21ce0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21cf0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21d00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21d10 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21d40 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
21d50 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21d60 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
21d70 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
21d80 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21d90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21da0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
21db0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
21dc0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
21dd0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
21de0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21df0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21e00 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21e10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21e20 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21e30 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
21e40 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
21e50 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
21e60 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
21e70 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
21e80 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
21e90 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
21ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
21eb0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
21ec0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21ed0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
21ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21ef0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21f00 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21f10 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21f20 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21f30 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
21f40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21f50 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21f60 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
21f70 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
21f80 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
21f90 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
21fa0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
21fb0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
21fc0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
21fd0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
21fe0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
21ff0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
22000 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
22010 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
22020 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
22040 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
22050 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
22060 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
22070 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
22080 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
22090 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
220a0 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
220b0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
220c0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
220d0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
220e0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
220f0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
22100 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
22110 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
22120 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
22130 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
22140 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
22150 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
22160 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
22170 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
22180 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
22190 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
221a0 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
221b0 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
221c0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
221d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
221e0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
221f0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
22200 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
22210 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
22220 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
22230 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
22240 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
22250 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
22260 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
22270 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
22280 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
22290 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
222a0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
222b0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
222c0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
222d0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
222e0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
222f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22300 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
22310 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
22320 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
22330 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
22340 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
22350 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
22360 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
22370 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
22380 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
22390 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
223a0 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
223b0 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
223c0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
223d0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
223e0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
223f0 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
22400 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
22410 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
22420 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
22430 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
22440 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
22450 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
22460 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
22470 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
22480 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
22490 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
224a0 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
224b0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
224c0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
224d0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
224e0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
224f0 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
22500 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
22510 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
22520 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
22530 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
22540 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
22550 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
22560 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
22570 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
22580 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
22590 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
225a0 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
225b0 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
225c0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
225d0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
225e0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
225f0 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
22600 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
22610 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
22620 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
22630 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
22640 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
22650 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
22660 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
22670 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
22680 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
22690 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
226a0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
226b0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
226c0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
226d0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
226e0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
226f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22700 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
22710 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
22720 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
22730 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
22740 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
22750 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
22780 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
227b0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
227c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
227d0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
22800 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
22810 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
22820 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
22830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22840 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
22850 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
22860 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22870 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
22890 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
228a0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
228b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
228c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
228d0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
228e0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
228f0 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
22920 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
22930 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
22940 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22950 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
22960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22970 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
22980 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
22990 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
229a0 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
229b0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
229c0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
229d0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
229e0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
229f0 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
22a00 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
22a10 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
22a20 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
22a30 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
22a40 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
22a50 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
22a60 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
22a70 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
22a80 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
22a90 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
22aa0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
22ab0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
22ac0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
22ad0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
22ae0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
22af0 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
22b00 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
22b10 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22b20 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
22b30 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
22b40 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
22b50 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
22b60 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
22b70 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
22b80 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
22b90 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
22ba0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
22bb0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
22bc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22bd0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
22be0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
22bf0 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
22c00 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
22c10 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22c20 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
22c30 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
22c40 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
22c50 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
22c60 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
22c70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
22c80 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
22c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22ca0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
22cb0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
22cc0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
22cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
22ce0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
22cf0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
22d00 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
22d10 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
22d20 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
22d30 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
22d40 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
22d50 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
22d60 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
22d70 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
22d80 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
22d90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
22da0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
22db0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
22dc0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
22dd0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
22de0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
22df0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
22e00 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
22e10 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22e20 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
22e30 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
22e40 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
22e50 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
22e60 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
22e70 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
22e80 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
22e90 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
22ea0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
22eb0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
22ec0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
22ed0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
22ee0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
22ef0 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
22f00 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
22f10 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22f20 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
22f30 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
22f40 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
22f50 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22f60 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
22f70 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
22f80 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
22f90 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
22fa0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
22fb0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
22fc0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
22fd0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
22fe0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
22ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
23000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23010 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
23020 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
23050 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
23060 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
23090 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
230a0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
230b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
230e0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
230f0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
23100 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23120 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
23130 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
23140 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23170 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
23180 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
23190 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
231a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
231b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
231c0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
231d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
231e0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
231f0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
23200 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
23210 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
23220 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
23230 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
23240 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23250 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
23260 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
23270 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
23280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
23290 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
232a0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
232b0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
232c0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
232d0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
232e0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
232f0 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
23300 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
23310 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
23320 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
23330 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
23340 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
23350 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
23360 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
23370 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23380 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
23390 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
233a0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
233b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
233c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
233d0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
233e0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
233f0 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
23400 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
23410 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
23420 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
23430 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
23440 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
23450 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
23460 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
23470 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
23480 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
23490 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
234a0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
234b0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
234c0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
234d0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
234e0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
234f0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
23500 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
23510 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
23520 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
23530 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
23540 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
23550 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
23560 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
23570 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
23580 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
23590 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
235a0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
235b0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
235c0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
235d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
235e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
235f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23600 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
23610 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
23620 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
23630 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
23640 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
23650 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
23660 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23670 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
23680 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
23690 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61  sor(pCur);.    a
236a0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
236b0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
236c0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
236d0 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
236e0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
236f0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
23700 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
23710 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
23720 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
23730 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
23740 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
23750 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
23760 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
23770 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
23780 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
237a0 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
237b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
237c0 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
237d0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) );.    }.    f
237e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
237f0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
23800 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23810 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
23820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
23830 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
23840 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
23850 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
23860 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
23870 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
23880 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
23890 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
238a0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
238b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
238c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
238d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
238e0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
238f0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
23900 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
23910 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
23920 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
23930 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
23940 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
23950 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
23960 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
23970 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
23980 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
23990 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
239a0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
239b0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
239c0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
239d0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
239e0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
239f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
23a00 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
23a10 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
23a20 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23a30 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
23a40 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
23a50 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
23a60 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
23a70 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
23a80 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
23a90 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
23aa0 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
23ab0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
23ac0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
23ad0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
23ae0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
23af0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
23b00 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
23b10 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
23b20 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
23b30 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
23b40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
23b50 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
23b60 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
23b70 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
23b80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
23b90 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
23ba0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
23bb0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23bc0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
23bd0 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
23be0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
23bf0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
23c00 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
23c10 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
23c20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23c30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23c40 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
23c50 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
23c60 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
23c70 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
23c80 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
23c90 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
23ca0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
23cb0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
23cc0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
23cd0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
23ce0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
23cf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
23d00 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
23d10 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
23d20 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
23d30 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
23d40 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23d50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23d60 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
23d70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23d80 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
23d90 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
23da0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
23db0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23dc0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
23dd0 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
23de0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
23df0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23e00 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
23e10 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
23e20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
23e30 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
23e40 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
23e50 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
23e60 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
23e70 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
23e80 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
23e90 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
23ea0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
23eb0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
23ec0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
23ed0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
23ee0 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
23ef0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
23f00 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
23f10 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
23f20 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
23f30 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
23f40 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
23f50 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
23f60 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
23f70 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
23f80 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
23f90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23fa0 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
23fb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
23fc0 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
23fd0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23fe0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23ff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24000 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24010 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
24020 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
24030 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
24040 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53  nKey;.  return S
24050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24060 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
24070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
24080 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
24090 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
240a0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
240b0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
240c0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
240d0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
240e0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
240f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
24100 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
24110 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
24120 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
24130 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
24140 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
24150 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
24160 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
24170 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
24180 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
24190 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
241a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
241b0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
241c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
241d0 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
241e0 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
241f0 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
24200 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
24210 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
24220 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
24230 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
24240 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
24250 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24260 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
24270 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
24280 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
24290 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
242a0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
242b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
242c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
242d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
242e0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
242f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24300 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
24310 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
24320 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24330 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24340 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20  ->intKeyLeaf==1 
24350 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
24360 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
24370 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50   = pCur->info.nP
24380 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
24390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
243a0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
243b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
243c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
243d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
243e0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
243f0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
24400 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
24410 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
24420 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
24430 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
24440 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
24450 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
24460 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
24470 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
24480 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
24490 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
244a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
244b0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
244c0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
244d0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
244e0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
244f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
24500 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
24510 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
24520 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
24530 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
24540 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
24550 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
24560 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
24570 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
24580 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
24590 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
245a0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
245b0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
245c0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
245d0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
245e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
245f0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
24600 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
24610 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
24620 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
24630 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
24640 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
24650 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
24660 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
24670 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
24680 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
24690 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
246a0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
246b0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
246c0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
246d0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
246e0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
246f0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
24700 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
24710 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
24720 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
24730 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
24740 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
24750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
24760 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
24770 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24790 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
247a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
247b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247c0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
247d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
247e0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
247f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
24800 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
24810 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
24820 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
24830 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24850 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
24860 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
24870 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
24880 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
24890 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
248a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
248b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
248c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
248d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
248e0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
248f0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
24900 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24910 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
24920 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
24930 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
24940 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
24950 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
24960 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
24970 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
24980 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
24990 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
249a0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
249b0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
249c0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
249d0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
249e0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
249f0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
24a00 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
24a10 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
24a20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
24a30 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
24a40 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
24a50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
24a60 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
24a70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
24a80 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
24a90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
24aa0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
24ab0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
24ac0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
24ad0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
24ae0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
24af0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
24b00 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
24b10 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
24b20 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
24b30 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
24b40 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
24b50 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
24b60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24b70 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
24b80 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
24b90 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
24ba0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
24bb0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
24bc0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
24bd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24be0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
24bf0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
24c00 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
24c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
24c30 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
24c40 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
24c50 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
24c60 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
24c70 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
24c80 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
24c90 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
24ca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
24cc0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
24cd0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
24ce0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
24cf0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
24d00 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
24d10 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
24d20 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
24d30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
24d40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
24d50 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
24d60 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
24d70 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
24d80 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
24d90 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
24da0 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
24db0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
24dc0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
24dd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
24de0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
24df0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
24e00 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
24e10 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
24e20 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
24e30 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24e40 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
24e50 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
24e60 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
24e70 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
24e80 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
24e90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24ea0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
24eb0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
24ec0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
24ed0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
24ee0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
24ef0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
24f00 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
24f10 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
24f20 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
24f30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
24f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
24f50 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
24f60 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
24f70 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24f80 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
24f90 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fb0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
24fc0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
24fd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24fe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
24ff0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
25000 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
25010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
25020 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
25030 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
25040 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
25050 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
25060 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
25070 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
25080 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
25090 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
250a0 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
250b0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
250c0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
250d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
250e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
250f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
25100 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25110 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
25120 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
25130 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
25140 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
25150 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
25160 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
25170 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
25180 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
25190 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
251a0 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
251b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
251c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
251d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
251e0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
251f0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
25200 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
25210 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
25220 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
25230 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
25240 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
25250 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
25260 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
25270 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
25280 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
25290 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
252a0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
252b0 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
252c0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
252d0 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
252e0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
252f0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20   cache..**   2: 
25300 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
25310 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20   a read. Do not 
25320 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
25330 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
25340 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
25350 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
25360 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
25370 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
25380 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
25390 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
253a0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
253b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
253c0 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
253d0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
253e0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
253f0 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
25400 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
25410 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
25420 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
25430 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
25440 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
25450 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
25460 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20  rflow pages and 
25470 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d  the.** eOp argum
25480 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68  ent is not 2, th
25490 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
254a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
254b0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a  or and lazily .*
254c0 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  * populates the 
254d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
254e0 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
254f0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
25500 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
25510 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
25520 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
25530 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
25540 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
25550 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
25560 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
25570 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
25580 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
25590 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
255a0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
255b0 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
255c0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
255d0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
255e0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
255f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
25600 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
25610 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
25620 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
25630 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
25640 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
25650 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
25660 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
25670 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
25680 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
25690 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
256a0 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
256b0 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
256c0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
256d0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
256e0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
256f0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
25700 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
25710 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
25720 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
25730 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
25740 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
25750 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
25760 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
25770 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
25780 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
25790 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
257a0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
257b0 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
257c0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
257d0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
257e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
257f0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
25800 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
25810 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
25820 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
25830 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
25840 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
25850 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
25860 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
25870 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
25880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25890 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
258a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
258b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
258c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
258d0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
258e0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
258f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25900 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25920 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
25930 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
25940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
25950 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
25960 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
25970 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
25980 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69  tart = pBuf;.  i
25990 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20  nt bEnd;        
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
259c0 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65   if reading to e
259d0 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65  nd of data */.#e
259e0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
259f0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
25a00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25a10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25a20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25a30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25a40 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
25a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
25a60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25a70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25a80 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73  ( eOp!=2 || offs
25a90 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41  et==0 );    /* A
25aa0 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d  lways start from
25ab0 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65   beginning for e
25ac0 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43  Op==2 */..  getC
25ad0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
25ae0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
25af0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
25b00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25b10 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
25b20 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66  EAD.  bEnd = off
25b30 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69  set+amt==pCur->i
25b40 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65  nfo.nPayload;.#e
25b50 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f  ndif.  assert( o
25b60 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
25b70 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
25b80 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79   );..  if( &aPay
25b90 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
25ba0 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
25bb0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
25bc0 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  bleSize] ){.    
25bd0 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
25be0 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
25bf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
25c00 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
25c10 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
25c20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25c30 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
25c40 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
25c50 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
25c60 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
25c70 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
25c80 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
25c90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25ca0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
25cb0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
25cc0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
25cd0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
25ce0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
25cf0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
25d00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
25d10 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
25d20 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
25d30 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30  Buf, a, (eOp & 0
25d40 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62  x01), pPage->pDb
25d50 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
25d60 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
25d70 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
25d80 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
25d90 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
25da0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
25db0 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }...  if( rc==SQ
25dc0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
25dd0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
25de0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
25df0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
25e00 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
25e10 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
25e20 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
25e30 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
25e40 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
25e50 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
25e60 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
25e70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
25e80 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
25e90 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
25ea0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
25eb0 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
25ec0 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e   ** Except, do n
25ed0 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65  ot allocate aOve
25ee0 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d  rflow[] for eOp=
25ef0 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =2..    **.    *
25f00 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
25f10 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
25f20 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
25f30 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
25f40 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
25f50 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
25f60 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
25f70 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
25f80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
25f90 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
25fa0 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
25fb0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
25fc0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
25fd0 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
25fe0 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
25ff0 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
26000 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
26010 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
26020 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26      if( eOp!=2 &
26030 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
26040 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26050 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
26060 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
26070 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
26080 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
26090 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
260a0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
260b0 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e  f( nOvfl>pCur->n
260c0 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  OvflAlloc ){.   
260d0 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
260e0 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
260f0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
26100 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
26110 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
26120 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
26130 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26140 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
26150 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26160 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
26170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26180 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
26190 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
261a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
261b0 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
261c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
261d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
261e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
261f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
26200 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
26210 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
26220 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43  no));.        pC
26230 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
26240 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
26250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26260 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
26270 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26280 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
26290 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
262a0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
262b0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
262c0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
262d0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
262e0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
262f0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
26300 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
26310 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26320 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20  alidOvfl)!=0.   
26330 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72    && pCur->aOver
26340 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
26350 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20  Size].    ){.   
26360 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
26370 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
26380 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26390 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
263a0 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
263b0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
263c0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Size);.    }..  
263d0 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
263e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
263f0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
26400 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20  x++){..      /* 
26410 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
26420 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
26430 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26440 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
26450 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
26460 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26470 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
26480 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
26490 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
264a0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
264b0 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72    || pCur->aOver
264c0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
264d0 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20  Page.           
264e0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
264f0 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  DB );.        pC
26500 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26510 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
26520 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
26530 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
26540 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
26550 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
26560 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
26570 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
26580 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
26590 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
265a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
265b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
265c0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
265d0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
265e0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
265f0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
26600 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
26610 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
26620 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
26630 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
26640 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
26650 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
26660 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
26670 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
26680 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
26690 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f  hat the aOverflo
266a0 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62  w[] array must b
266b0 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61  e allocated beca
266c0 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20  use eOp!=2.     
266d0 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20     ** here.  If 
266e0 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66  eOp==2, then off
266f0 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20  set==0 and this 
26700 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20  branch is never 
26710 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a  taken..        *
26720 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26730 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20  ( eOp!=2 );.    
26740 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26750 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26760 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
26770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26780 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
26790 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
267a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
267b0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
267c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
267d0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
267e0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
267f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26800 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
26810 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
26820 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
26830 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
26840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
26850 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
26860 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
26870 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
26880 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
26890 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
268a0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
268b0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
268c0 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
268d0 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
268e0 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
268f0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
26900 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
26910 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26920 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26930 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
26940 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20   *fd;.#endif.   
26950 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
26960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
26970 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
26980 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
26990 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
269a0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
269b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
269c0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
269d0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
269e0 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
269f0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
26a00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26a10 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
26a20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
26a30 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
26a40 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
26a50 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
26a60 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
26a70 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
26a80 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
26a90 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73    3) the databas
26aa0 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64  e is file-backed
26ab0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
26ac0 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e     4) there is n
26ad0 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
26ae0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
26af0 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
26b00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
26b10 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
26b20 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  ,.        **   6
26b30 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  ) all data from 
26b40 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
26b50 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20  g read..        
26b60 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74  **   7) at least
26b70 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c   4 bytes have al
26b80 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20  ready been read 
26b90 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
26ba0 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20  buffer .        
26bb0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
26bc0 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72  en data can be r
26bd0 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ead directly fro
26be0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
26bf0 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ile into the.   
26c00 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62       ** output b
26c10 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67  uffer, bypassing
26c20 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
26c30 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73  altogether. This
26c40 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20   speeds.        
26c50 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61  ** up loading la
26c60 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  rge records that
26c70 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66   span many overf
26c80 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20  low pages..     
26c90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
26ca0 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20  ( (eOp&0x01)==0 
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
26ce0 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65          && offse
26cf0 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  t==0            
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d20 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
26d30 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d   && (bEnd || a==
26d40 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20  ovflSize)       
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d60 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
26d70 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
26d80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
26d90 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
26dc0 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
26dd0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
26de0 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
26df0 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20  hods     /* (3) 
26e00 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
26e10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
26e20 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20  a[19]==0x01     
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
26e50 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
26e60 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37             /* (7
26e90 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
26ea0 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
26eb0 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
26ec0 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
26ed0 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
26ee0 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
26ef0 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65          /* hence
26f20 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
26f30 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
26f40 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
26f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26f60 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
26f70 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
26f80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
26f90 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
26fa0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
26fb0 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
26fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
26fd0 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
26fe0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
26ff0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
27000 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
27010 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
27020 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27030 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
27040 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
27050 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
27060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27070 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f  ((eOp&0x01)==0 ?
27080 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
27090 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
270a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
270b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
270c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
270d0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
270e0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
270f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27100 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
27110 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
27120 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
27130 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
27140 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
27150 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
27160 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50  (eOp&0x01), pDbP
27170 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27180 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
27190 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
271a0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
271b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
271c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
271d0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
271e0 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
271f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27200 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
27210 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27220 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27230 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27240 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
27250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
27260 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
27270 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
27280 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
27290 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
272a0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
272b0 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f  transferred into
272c0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
272d0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
272e0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
272f0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
27300 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
27310 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
27320 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
27330 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
27340 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
27350 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
27360 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
27370 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
27380 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
27390 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
273a0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
273b0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
273c0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
273d0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
273e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
273f0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
27400 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
27410 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
27420 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
27430 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27440 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27450 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27460 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27480 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27490 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274a0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
274b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
274c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
274d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
274f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
27500 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
27510 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
27520 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
27530 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
27540 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
27550 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
27560 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
27570 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
27580 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
27590 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
275a0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
275b0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
275c0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
275d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
275e0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
275f0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
27600 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
27610 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
27620 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
27630 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
27640 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
27650 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
27660 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
27670 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27680 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
27690 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
276a0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
276b0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
276c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
276d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
276e0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
276f0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
27700 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
27710 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
27720 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
27730 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
27740 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
27750 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
27760 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
27770 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
27780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27790 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
277a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
277b0 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
277c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
277d0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
277e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
277f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
27800 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27810 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
27820 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27830 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
27840 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
27850 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
27860 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
27870 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27880 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
27890 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
278a0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
278b0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
278c0 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
278d0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
278e0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
278f0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
27900 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
27910 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20  he key if index 
27920 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
27930 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73  ntKey==0) and is
27940 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a   the data for.**
27950 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70   table btrees (p
27960 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29  Page->intKey==1)
27970 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
27980 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
27990 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69  le.** key/data i
279a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
279b0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
279c0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
279d0 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  ue.** returned w
279e0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c  ill not be a val
279f0 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
27a00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
27a10 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
27a20 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
27a30 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
27a40 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
27a50 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
27a60 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
27a70 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
27a80 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
27a90 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
27aa0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
27ab0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
27ac0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
27ad0 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
27ae0 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
27af0 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
27b00 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
27b10 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
27b20 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
27b30 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
27b40 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
27b50 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
27b60 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
27b70 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
27b80 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
27b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
27ba0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
27bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
27bc0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
27bd0 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
27be0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
27bf0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
27c00 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
27c10 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
27c20 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
27c30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
27c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
27c50 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79  t void *fetchPay
27c60 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
27c70 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
27c80 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
27c90 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
27ca0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a   from */.  u32 *
27cb0 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20  pAmt            
27cc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
27cd0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
27ce0 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29   bytes here */.)
27cf0 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61  {.  u32 amt;.  a
27d00 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
27d10 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
27d20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
27d30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
27d40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27d50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27d60 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
27d70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27d80 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
27d90 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
27da0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27db0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
27dc0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
27dd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27de0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
27df0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27e00 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
27e10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
27e20 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
27e30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
27e40 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72  fo.pPayload>pCur
27e50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27e60 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20  Page]->aData || 
27e70 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
27e80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
27e90 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72  fo.pPayload<pCur
27ea0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27eb0 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
27ec0 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20  ||CORRUPT_DB);. 
27ed0 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75   amt = (int)(pCu
27ee0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27ef0 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
27f00 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
27f10 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70  ayload);.  if( p
27f20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27f30 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75  <amt ) amt = pCu
27f40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
27f50 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20    *pAmt = amt;. 
27f60 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
27f70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27f80 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
27f90 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
27fa0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
27fb0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
27fc0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
27fd0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
27fe0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
27ff0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
28000 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
28010 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
28020 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
28030 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
28040 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
28050 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
28060 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
28070 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
28080 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
28090 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
280a0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
280b0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
280c0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
280d0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
280e0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
280f0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
28100 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
28110 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
28120 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
28130 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
28140 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
28150 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
28160 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
28170 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
28180 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
28190 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
281a0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
281b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
281c0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
281d0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
281e0 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
281f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28200 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
28210 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
28220 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e  ur, pAmt);.}.con
28230 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
28240 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
28250 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28260 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
28270 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
28280 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
28290 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
282a0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
282b0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
282c0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
282d0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
282e0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
282f0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
28300 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
28310 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28320 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
28330 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
28340 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
28350 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
28360 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
28370 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
28380 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
28390 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
283a0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
283b0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
283c0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
283d0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
283e0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
283f0 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
28400 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
28410 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
28420 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
28430 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28440 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
28450 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28460 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28470 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28480 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28490 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
284a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
284b0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
284c0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
284d0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
284e0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
284f0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
28500 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
28510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28520 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28530 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
28540 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
28550 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28560 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
28570 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
28580 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  l);.  pCur->iPag
28590 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  e++;.  pCur->aiI
285a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
285b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  = 0;.  return ge
285c0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
285d0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
285e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
285f0 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28610 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
28620 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
28630 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28640 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
28650 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
28660 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
28670 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
28680 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
28690 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
286a0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
286b0 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
286c0 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
286d0 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
286e0 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
286f0 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
28700 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
28710 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
28720 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
28730 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
28740 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
28750 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
28760 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
28770 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
28780 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
28790 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
287a0 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
287b0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
287c0 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
287d0 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
287e0 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
287f0 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
28820 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
28830 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
28840 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
28850 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
28860 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
28870 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
28880 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
28890 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
288a0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
288b0 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
288c0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
288d0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
288e0 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
288f0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
28900 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
28910 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
28920 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
28930 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28940 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
28950 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
28960 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
28970 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
28980 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
28990 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
289a0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
289b0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
289c0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
289d0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
289e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
289f0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
28a00 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
28a10 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
28a20 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
28a30 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
28a40 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
28a50 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
28a60 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
28a70 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28a80 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28a90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28aa0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28ac0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
28ad0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28ae0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28af0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
28b00 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
28b10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28b20 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
28b30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28b40 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
28b50 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
28b60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
28b70 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
28b80 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
28b90 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
28ba0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28bb0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
28bc0 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
28bd0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
28be0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28bf0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
28c00 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
28c10 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  l);.  releasePag
28c20 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
28c30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28c40 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e--]);.}../*.** 
28c50 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28c60 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
28c70 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
28c80 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
28c90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
28ca0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
28cb0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
28cc0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
28cd0 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
28ce0 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
28cf0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
28d00 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
28d10 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
28d20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
28d30 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
28d40 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
28d50 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
28d60 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
28d70 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
28d80 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
28d90 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
28da0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
28db0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
28dc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
28dd0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
28de0 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
28df0 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
28e00 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
28e10 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
28e20 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
28e30 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
28e40 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
28e50 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
28e60 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
28e70 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
28e80 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
28e90 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
28ea0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
28eb0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
28ec0 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
28ed0 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
28ee0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
28ef0 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
28f00 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
28f10 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
28f20 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
28f30 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
28f40 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
28f50 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
28f60 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
28f70 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
28f80 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
28f90 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
28fa0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
28fb0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
28fc0 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
28fd0 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
28fe0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
28ff0 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
29000 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
29010 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
29020 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29030 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29040 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
29050 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
29060 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
29070 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29080 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
29090 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
290a0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
290b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
290c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
290d0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
290e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
290f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
29100 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
29110 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
29120 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
29130 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
29140 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
29150 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
29160 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
29170 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
29180 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
29190 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
291a0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
291b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
291c0 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
291d0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
291e0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
291f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29200 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
29210 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29220 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
29230 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
29240 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
29250 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
29260 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
29270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29280 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29290 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20  >iPage]!=0 );.  
292a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
292b0 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
292c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
292d0 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -]);.    }.  }el
292e0 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
292f0 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
29300 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29310 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29330 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
29340 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29350 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
29360 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
29370 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
29380 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
29390 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
293a0 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
293d0 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
293e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
293f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
29400 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29410 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
29420 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29430 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
29440 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
29450 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
29460 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
29470 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
29480 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
29490 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
294a0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
294b0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
294c0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
294d0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
294e0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
294f0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
29500 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
29510 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
29520 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
29530 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
29540 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
29550 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
29560 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
29570 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
29580 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
29590 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
295a0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
295b0 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
295c0 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
295d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
295e0 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
295f0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
29600 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
29610 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
29620 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
29630 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
29640 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
29650 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
29660 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
29670 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
29680 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
29690 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
296a0 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
296b0 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
296c0 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
296d0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
296e0 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
296f0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
29700 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29710 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
29720 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
29730 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
29740 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
29750 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
29760 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
29770 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
29780 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29790 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
297a0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
297b0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
297c0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
297d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
297e0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
297f0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
29800 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
29810 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
29820 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
29830 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29840 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
29850 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
29860 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
29870 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
29880 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
29890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
298a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
298b0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
298c0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
298d0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
298e0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
298f0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
29900 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
29910 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29920 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
29930 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
29940 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
29950 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
29960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29970 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29980 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
29990 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
299a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
299b0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
299c0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
299d0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
299e0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
299f0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
29a00 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
29a10 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
29a20 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
29a30 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
29a40 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
29a50 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
29a60 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
29a70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29a80 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
29a90 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
29aa0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29ab0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29ac0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ad0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29ae0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
29af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29b00 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
29b10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29b20 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
29b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29b40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29b50 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
29b60 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
29b70 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
29b80 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
29b90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29ba0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
29bb0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29bc0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
29bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29be0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
29bf0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
29c00 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
29c10 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
29c20 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
29c30 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
29c40 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
29c50 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
29c60 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
29c70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
29c80 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
29c90 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
29ca0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
29cb0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
29cc0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
29cd0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
29ce0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29cf0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
29d00 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
29d10 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
29d20 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
29d30 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
29d40 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
29d50 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
29d60 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
29d70 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
29d80 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29d90 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
29da0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
29db0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
29dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29dd0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
29de0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
29df0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29e00 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29e20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29e30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
29e40 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70  ile( !(pPage = p
29e50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29e60 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
29e70 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
29e80 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
29e90 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
29ea0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
29eb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29ec0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
29ed0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
29ee0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
29ef0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
29f00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
29f10 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69  ;.  }.  pCur->ai
29f20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29f30 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
29f40 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  1;.  assert( pCu
29f50 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
29f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
29f70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
29f80 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d  BTCF_ValidNKey)=
29f90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
29fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
29fb0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29fc0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
29fd0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
29fe0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
29ff0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2a000 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2a010 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2a020 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2a030 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2a040 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2a050 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2a060 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2a070 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
2a080 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a090 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2a0a0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2a0b0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a0c0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a0d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a0e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a0f0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a100 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
2a110 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2a120 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2a140 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a150 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
2a160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a170 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a180 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2a190 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2a1a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
2a1b0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
2a1c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2a1d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2a1e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a1f0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
2a200 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a210 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
2a220 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2a230 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2a240 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2a250 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2a260 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a270 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2a280 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2a290 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2a2a0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2a2b0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2a2c0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2a2d0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2a2e0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2a2f0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2a300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a310 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
2a320 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2a330 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2a340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a350 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a360 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a370 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a380 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2a390 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2a3a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2a3b0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
2a3c0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
2a3d0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
2a3e0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
2a3f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2a400 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
2a410 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a420 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2a430 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2a440 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
2a450 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
2a460 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2a470 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
2a480 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
2a490 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
2a4a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
2a4b0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
2a4c0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
2a4d0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
2a4e0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2a4f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2a500 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
2a510 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
2a520 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
2a530 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a540 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2a550 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
2a560 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a570 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
2a580 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2a590 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2a5a0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2a5b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a5c0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2a5d0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2a5e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a5f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2a600 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2a610 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2a620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a630 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a640 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2a650 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2a660 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
2a670 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
2a680 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2a690 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2a6a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2a6b0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a6c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
2a6d0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2a6e0 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ur);.      if( r
2a6f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a700 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2a710 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41  rFlags |= BTCF_A
2a720 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  tLast;.      }el
2a730 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72  se{.        pCur
2a740 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
2a750 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2a760 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20    }.   .    }.  
2a770 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a780 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2a790 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
2a7a0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
2a7b0 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
2a7c0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
2a7d0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
2a7e0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
2a7f0 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
2a800 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
2a810 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
2a820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
2a830 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
2a840 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
2a850 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2a860 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
2a870 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
2a880 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
2a890 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
2a8a0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
2a8b0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
2a8c0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
2a8d0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2a8e0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
2a8f0 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
2a900 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
2a910 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
2a920 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
2a930 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
2a940 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
2a950 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2a960 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
2a970 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
2a980 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
2a990 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
2a9a0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
2a9b0 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
2a9c0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
2a9d0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
2a9e0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
2a9f0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
2aa00 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
2aa10 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
2aa20 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
2aa30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2aa40 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
2aa50 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2aa60 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2aa70 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2aa80 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
2aa90 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
2aaa0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
2aab0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2aac0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2aad0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
2aae0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
2aaf0 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
2ab00 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
2ab10 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
2ab20 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2ab30 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2ab40 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2ab70 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2ab80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
2ab90 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2aba0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2abb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2abc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2abd0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
2abe0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2abf0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  dxKey..**.** For
2ac00 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74   index tables, t
2ac10 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65  he pIdxKey->eqSe
2ac20 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  en field is set 
2ac30 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a  to 1 if there.**
2ac40 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79   exists an entry
2ac50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2ac60 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  at exactly match
2ac70 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f  es pIdxKey.  .*/
2ac80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ac90 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
2aca0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2acb0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
2acc0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
2acd0 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
2ace0 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
2acf0 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
2ad00 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
2ad10 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
2ad20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ad30 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
2ad40 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
2ad50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2ad60 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
2ad70 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
2ad80 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
2ad90 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2ada0 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
2adb0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2adc0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2add0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
2ade0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
2adf0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2ae00 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ae10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ae20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ae30 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2ae40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2ae50 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
2ae60 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
2ae70 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
2ae80 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
2ae90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2aea0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2aeb0 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
2aec0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
2aed0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
2aee0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
2aef0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2af00 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
2af10 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2af20 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2af30 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2af40 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2af50 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
2af60 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a  Cur->curIntKey .
2af70 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
2af80 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2af90 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2afa0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2afb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2afc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
2afd0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2afe0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2aff0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
2b000 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2b010 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2b020 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b030 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2b040 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2b050 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2b060 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2b070 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2b080 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2b090 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2b0a0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2b0b0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2b0c0 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2b0d0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2b0e0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2b0f0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2b100 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2b110 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2b120 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2b130 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2b140 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2b150 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2b160 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2b170 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2b180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2b190 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b1a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2b1b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b1c0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
2b1d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2b1e0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2b1f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b200 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
2b210 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b220 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b230 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
2b240 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b250 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
2b260 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2b270 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2b280 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
2b290 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2b2a0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2b2b0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2b2c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b2d0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2b2e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b2f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
2b300 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2b310 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
2b320 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
2b330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2b340 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2b350 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2b360 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2b370 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2b380 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2b390 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2b3a0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2b3b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2b3c0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b3f0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2b400 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2b410 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2b420 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2b430 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2b440 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2b450 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2b460 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2b470 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2b480 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2b490 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2b4a0 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2b4b0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2b4c0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2b4d0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2b4e0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2b4f0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2b500 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2b510 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2b520 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2b530 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2b540 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2b550 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2b560 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2b570 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2b580 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2b590 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2b5a0 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2b5b0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2b5c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b5d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2b5e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b5f0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2b600 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2b610 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2b620 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2b630 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2b640 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2b650 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2b660 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2b670 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2b680 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2b690 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2b6a0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2b6b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b6c0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2b6d0 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2b6e0 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2b6f0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2b700 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2b710 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2b720 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2b730 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2b740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2b750 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2b760 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2b770 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2b780 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2b790 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2b7a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2b7b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b7c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b7e0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2b7f0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2b800 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2b810 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2b820 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2b830 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2b840 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2b850 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2b860 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2b870 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2b880 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2b890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2b8a0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2b8b0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2b8c0 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2b8d0 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2b8e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2b8f0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2b900 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2b910 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2b920 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2b930 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2b940 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2b950 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2b960 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2b970 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2b980 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2b990 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2b9a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2b9b0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b9d0 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
2b9e0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
2b9f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ba00 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ba10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ba20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2ba30 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2ba40 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2ba50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ba60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2ba70 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2ba80 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2ba90 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2baa0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2bab0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2bac0 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2bad0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2bae0 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2baf0 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2bb00 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2bb10 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2bb20 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2bb30 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2bb40 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2bb50 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2bb60 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2bb70 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2bb80 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2bb90 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2bba0 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2bbb0 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2bbc0 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2bbd0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2bbe0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2bbf0 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2bc00 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2bc10 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2bc20 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2bc30 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2bc40 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2bc50 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2bc60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2bc70 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2bc80 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2bc90 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2bca0 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2bcb0 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2bcc0 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2bcd0 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2bce0 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2bcf0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2bd00 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2bd10 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2bd20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2bd30 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2bd40 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2bd50 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2bd60 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2bd70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2bd80 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2bd90 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2bda0 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2bdb0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2bdc0 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2bdd0 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2bde0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2bdf0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2be00 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2be10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2be20 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2be30 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2be40 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2be50 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2be60 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2be70 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2be80 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2be90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2bea0 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2beb0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2bec0 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2bed0 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2bee0 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2bef0 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2bf00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2bf10 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2bf20 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2bf30 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2bf40 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2bf50 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2bf60 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2bf70 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2bf80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bf90 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2bfa0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2bfb0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2bfc0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2bfd0 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2bfe0 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2bff0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2c000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2c010 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2c020 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2c030 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2c040 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2c050 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2c060 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2c070 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2c080 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2c090 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2c0a0 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2c0b0 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2c0c0 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2c0d0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2c0e0 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2c0f0 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2c100 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2c110 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2c120 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c130 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2c140 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2c150 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2c160 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2c170 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2c180 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2c190 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2c1a0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2c1b0 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2c1c0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2c1d0 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2c1e0 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2c1f0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2c200 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2c210 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2c220 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2c230 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2c240 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2c250 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2c260 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2c270 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2c280 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2c290 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2c2a0 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2c2b0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2c2c0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2c2d0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2c2e0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2c2f0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2c300 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2c310 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2c320 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2c330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c340 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2c350 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2c360 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2c370 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2c380 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2c390 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2c3a0 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2c3b0 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2c3c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2c3d0 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2c3e0 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2c3f0 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2c400 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2c410 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20  nCell<2 ){.     
2c420 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c430 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c450 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c470 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2c480 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2c490 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2c4a0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2c4b0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2c4c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c4d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2c4e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c4f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c510 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c520 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2c530 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2c540 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2c550 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2c560 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c570 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
2c580 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2c590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2c5a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2c5b0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2c5c0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c5d0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c5e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2c5f0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2c600 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2c610 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2c620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c630 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2c640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2c650 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2c660 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2c670 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2c680 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2c690 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2c6a0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2c6b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2c6c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2c6d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2c6e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c6f0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2c700 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2c710 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c720 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2c730 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2c740 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c750 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2c760 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2c770 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c780 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c7a0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c7b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c7c0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c7d0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2c7e0 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2c7f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2c800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c810 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c830 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2c840 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2c850 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2c860 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2c870 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2c880 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2c890 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2c8a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2c8b0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2c8c0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2c8d0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2c8e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c8f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2c900 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2c910 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2c920 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c930 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2c940 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c950 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2c960 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2c970 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c980 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c990 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2c9a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c9b0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2c9c0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c9d0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2c9e0 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2c9f0 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2ca00 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2ca10 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ca20 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2ca30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2ca40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ca50 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2ca60 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2ca70 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2ca80 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2ca90 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2caa0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2cab0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2cac0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2cad0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2cae0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2caf0 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2cb00 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2cb10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2cb20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2cb30 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2cb40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2cb50 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2cb60 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2cb70 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2cb80 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2cb90 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2cba0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2cbb0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2cbc0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2cbd0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2cbe0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2cbf0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2cc00 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2cc10 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2cc20 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2cc30 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2cc40 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2cc50 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2cc60 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2cc70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2cc80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2cc90 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2cca0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2ccb0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2ccc0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2ccd0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2cce0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2ccf0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2cd00 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2cd10 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2cd20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2cd30 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2cd40 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2cd50 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2cd60 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2cd70 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2cd80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2cd90 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2cda0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2cdb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2cdc0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2cdd0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2cde0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2cdf0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2ce00 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2ce10 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2ce20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2ce30 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2ce40 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2ce50 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2ce60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2ce70 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2ce80 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2ce90 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2cea0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2ceb0 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2cec0 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2ced0 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2cee0 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2cef0 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2cf00 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2cf10 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2cf20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2cf30 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2cf40 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2cf50 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2cf60 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2cf70 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2cf80 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2cf90 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2cfa0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2cfb0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2cfc0 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2cfd0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2cfe0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2cff0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2d000 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2d010 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2d020 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2d030 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2d040 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2d050 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2d060 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2d070 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2d080 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2d090 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2d0a0 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2d0b0 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2d0c0 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2d0d0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2d0e0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2d0f0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2d100 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2d110 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2d120 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2d130 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2d140 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2d150 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2d160 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2d170 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2d180 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2d190 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2d1a0 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2d1b0 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2d1c0 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2d1d0 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2d1e0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2d1f0 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2d200 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2d210 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2d220 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2d230 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2d240 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2d250 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2d260 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d270 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2d280 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2d290 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2d2b0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2d2c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d2d0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2d2e0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2d2f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2d300 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2d310 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2d320 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2d330 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2d340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d350 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2d370 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2d380 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2d390 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2d3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d3b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2d3c0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d3d0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2d3e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d3f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d400 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2d410 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2d420 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2d430 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d440 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2d450 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2d460 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2d470 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d480 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d4a0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2d4b0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2d4c0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2d4d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d4e0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d4f0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2d500 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d520 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2d530 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2d540 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2d550 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2d560 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2d570 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2d580 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2d590 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2d5a0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2d5b0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2d5c0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2d5d0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2d5e0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2d5f0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2d600 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2d610 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2d620 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2d630 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2d640 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2d650 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2d660 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2d670 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2d680 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2d690 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2d6a0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2d6b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d6c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d6d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2d6e0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2d6f0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2d700 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2d710 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2d720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2d730 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d740 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d750 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d760 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2d770 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2d780 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2d790 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2d7a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d7b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2d7c0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2d7d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2d7f0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2d800 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2d810 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d820 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2d830 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2d840 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2d850 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2d860 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2d870 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2d880 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2d890 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d8a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d8b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d8c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2d8d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d8e0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d8f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d900 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d910 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d920 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2d930 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2d940 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d950 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2d960 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2d970 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2d980 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2d990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2d9a0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2d9b0 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2d9c0 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2d9d0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d9e0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d9f0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2da00 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
2da10 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2da20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2da30 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2da40 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2da50 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  vfl);.  *pRes = 
2da60 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2da70 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2da80 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2da90 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2daa0 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  s);.  pPage = pC
2dab0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2dac0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
2dad0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2dae0 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61  ur->iPage])>=pPa
2daf0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2db00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2db10 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2db20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2db30 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2db40 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2db50 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2db60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2db70 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2db80 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2db90 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
2dba0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
2dbb0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
2dbc0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2dbd0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2dbe0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2dbf0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2dc00 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2dc10 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2dc20 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2dc30 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
2dc40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2dc50 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2dc60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2dc70 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2dc80 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2dc90 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2dca0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2dcb0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
2dcc0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2dcd0 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2dce0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2dcf0 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
2dd00 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2dd10 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2dd20 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2dd30 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
2dd40 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2dd50 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2dd60 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
2dd70 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
2dd80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2dd90 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2dda0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2ddb0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2ddc0 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
2ddd0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2dde0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2ddf0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2de00 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2de10 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2de20 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2de30 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2de40 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2de50 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2de60 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2de70 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2de80 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2de90 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2dea0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2deb0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2dec0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2ded0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2dee0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2def0 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2df00 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2df10 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2df20 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2df30 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2df40 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2df50 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2df60 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2df70 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2df80 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2df90 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2dfa0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2dfb0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2dfc0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2dfd0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2dfe0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2dff0 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2e000 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2e010 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2e020 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
2e030 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2e040 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2e050 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
2e060 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2e070 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2e080 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2e090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2e0a0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2e0b0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2e0c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e0d0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2e0e0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e0f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2e100 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2e110 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
2e120 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2e130 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2e140 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
2e150 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2e160 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
2e170 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e180 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2e190 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2e1a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2e1b0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2e1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e1d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e1e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2e1f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2e200 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2e210 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e230 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2e240 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e250 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2e260 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2e270 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2e280 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2e290 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2e2a0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2e2b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2e2c0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2e2d0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
2e2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2e2f0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e320 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2e330 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2e340 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2e350 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e360 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2e370 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e380 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
2e390 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e3a0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
2e3b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e3c0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
2e3d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e3e0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2e3f0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
2e400 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e410 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
2e420 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2e430 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2e440 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2e450 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e460 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
2e470 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e480 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e490 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e4a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e4b0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2e4c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e4d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e4e0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2e4f0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2e500 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e510 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e520 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e530 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2e540 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64  gs & (BTCF_Valid
2e550 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2e560 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2e570 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e580 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2e590 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e5a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e5b0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
2e5c0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e5d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e5e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e5f0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2e600 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2e610 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e620 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e640 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e650 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e660 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e670 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72   *pRes){.  asser
2e680 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e690 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e6a0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2e6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2e6c0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2e6d0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2e6e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2e6f0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2e700 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e710 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e720 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e730 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2e740 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2e750 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2e760 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2e770 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2e780 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e790 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2e7a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e7b0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2e7c0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2e7d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2e7e0 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2e7f0 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2e800 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2e810 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2e820 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e830 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2e840 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e850 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2e860 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2e870 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2e880 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2e890 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2e8a0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2e8b0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2e8c0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2e8d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e8e0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2e8f0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2e900 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2e910 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2e920 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2e930 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2e940 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2e950 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2e960 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2e970 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2e980 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2e990 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2e9a0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2e9b0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2e9c0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2e9d0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2e9e0 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
2e9f0 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
2ea00 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2ea10 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
2ea20 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2ea30 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2ea40 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2ea50 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2ea60 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2ea70 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2ea80 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2ea90 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2eaa0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2eab0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2eac0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2ead0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2eae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2eaf0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2eb00 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2eb10 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2eb20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2eb30 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2eb40 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2eb50 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2eb60 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2eb70 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2eb80 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2eb90 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2eba0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2ebb0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2ebc0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2ebd0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2ebe0 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2ebf0 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2ec00 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2ec10 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2ec20 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2ec30 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2ec40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2ec50 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2ec60 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2ec70 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2ec80 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2ec90 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2eca0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2ecb0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2ecc0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2ecd0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2ece0 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2ecf0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ed00 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2ed10 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2ed20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2ed30 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2ed40 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2ed50 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2ed60 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2ed70 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2ed80 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2eda0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2edb0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2edc0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2edd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2ede0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2edf0 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2ee00 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2ee10 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2ee20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2ee30 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2ee40 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2ee50 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2ee60 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2ee70 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2ee80 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2ee90 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2eea0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2eeb0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2eec0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2eed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2eee0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2eef0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ef00 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ef10 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2ef20 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2ef30 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2ef40 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2ef50 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2ef60 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2ef70 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2ef80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ef90 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2efa0 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2efb0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2efc0 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2efd0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2efe0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2eff0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2f000 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2f010 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2f020 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2f030 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2f040 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2f050 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2f060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f070 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2f080 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2f090 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2f0a0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2f0b0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2f0c0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2f0d0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2f0e0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2f0f0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2f100 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2f110 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2f120 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2f130 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
2f140 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
2f150 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2f160 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
2f170 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2f180 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2f190 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2f1a0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2f1b0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2f1c0 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2f1d0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2f1e0 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2f1f0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2f200 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2f210 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2f220 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2f230 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2f240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f250 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f260 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2f270 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2f280 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2f290 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2f2a0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2f2b0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2f2c0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2f2d0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2f2e0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2f2f0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2f300 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2f310 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2f320 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f330 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2f340 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2f350 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2f360 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f370 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2f380 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f390 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2f3a0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2f3b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2f3c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2f3d0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2f3e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2f3f0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2f400 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2f410 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2f420 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2f430 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2f440 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2f450 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2f460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f470 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f480 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f490 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f4a0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2f4b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f4c0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2f4d0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2f4e0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2f4f0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2f500 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2f510 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2f520 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2f530 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2f540 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2f550 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2f560 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2f570 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2f580 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f590 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f5a0 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2f5b0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2f5c0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2f5d0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2f5e0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2f5f0 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2f600 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2f610 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2f620 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2f630 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
2f640 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f650 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
2f660 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
2f670 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f680 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
2f690 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
2f6a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
2f6b0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2f6c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
2f6d0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
2f6e0 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
2f6f0 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
2f700 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
2f710 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2f720 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2f730 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2f740 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f750 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2f760 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
2f770 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
2f780 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f790 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
2f7a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2f7b0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
2f7c0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
2f7d0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
2f7e0 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
2f7f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f800 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
2f810 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
2f820 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f830 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f840 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2f850 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2f860 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2f870 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2f880 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
2f890 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
2f8a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f8b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f8d0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2f8e0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
2f8f0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2f900 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2f910 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f920 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f930 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f940 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f960 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2f970 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f980 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2f990 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
2f9a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
2f9b0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
2f9c0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
2f9d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f9e0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
2f9f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
2fa00 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
2fa10 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
2fa20 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
2fa30 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2fa40 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
2fa50 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2fa60 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2fa70 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2fa80 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2fa90 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2faa0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2fab0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2fac0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2fad0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2fae0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2faf0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2fb00 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2fb10 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2fb20 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2fb30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2fb40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fb50 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2fb60 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2fb70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2fb80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fb90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fba0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2fbb0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2fbc0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2fbd0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2fbe0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fbf0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2fc00 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fc10 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2fc20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2fc30 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2fc40 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2fc50 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2fc60 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2fc70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2fc80 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2fc90 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2fca0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2fcb0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2fcc0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2fcd0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2fce0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fcf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fd00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2fd10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fd20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fd30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fd40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fd50 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2fd60 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2fd70 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2fd80 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2fd90 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fda0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2fdb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2fdc0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2fdd0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2fde0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2fdf0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2fe00 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2fe10 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2fe20 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2fe30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fe40 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fe50 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2fe60 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fe70 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2fe80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2fe90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fea0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2feb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2fec0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fed0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2fee0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2fef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2ff00 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2ff10 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2ff20 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2ff30 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2ff40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2ff50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2ff60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2ff70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ff80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ff90 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2ffa0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ffb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2ffc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2ffe0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fff0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30010 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
30020 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
30030 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30040 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
30050 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30070 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
30080 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
30090 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
300a0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
300b0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
300c0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
300d0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
300e0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
300f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
30100 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
30110 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30120 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
30130 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
30140 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
30150 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
30160 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
30170 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
30180 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
30190 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
301a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
301b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
301c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
301d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
301e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
301f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30200 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
30210 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
30220 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30230 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
30240 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
30250 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
30260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30280 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30290 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
302a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
302b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
302c0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
302d0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
302e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
302f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30300 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30310 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
30320 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30330 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30340 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
30350 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30360 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
30370 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
30380 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30390 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
303a0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
303b0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
303c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
303d0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
303e0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
303f0 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
30400 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
30410 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
30420 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
30430 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
30440 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
30450 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30460 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30470 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
30480 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
30490 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
304a0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
304b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
304c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
304d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
304e0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
304f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30510 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
30520 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30530 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30550 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30560 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
30570 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
30580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
305a0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
305b0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
305c0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
305d0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
305e0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
305f0 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
30600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
30610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
30620 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
30630 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
30640 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
30650 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
30660 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
30670 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30680 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
30690 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
306a0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
306b0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
306c0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
306d0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
306e0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
306f0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
30700 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30710 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
30720 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
30730 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
30740 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
30750 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
30760 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
30780 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
30790 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
307a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
307b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
307c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
307d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
307e0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
307f0 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
30800 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30810 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
30820 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
30830 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
30840 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30850 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
30860 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
30870 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30880 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
30890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
308a0 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
308c0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
308d0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
308e0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
308f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30910 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30920 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30930 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
30940 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
30950 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
30960 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
30970 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
30980 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
30990 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
309a0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
309b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
309c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
309d0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
309e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
309f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30a00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30a10 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
30a20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
30a30 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
30a40 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d       || (iPage==
30a50 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65  nearby || (iPage
30a60 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
30a70 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
30a80 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
30a90 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
30aa0 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
30ab0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
30ac0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
30ad0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
30ae0 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
30af0 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
30b10 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
30b20 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
30b30 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
30b40 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
30b50 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
30b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
30b70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30b80 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30b90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30ba0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
30bb0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30bc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
30bd0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
30be0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30bf0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
30c00 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
30c10 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
30c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
30c30 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
30c40 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
30c50 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
30c60 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
30c70 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f  nt(pBt, *pPgno)?
30c80 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
30c90 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20  TENT : 0;.      
30ca0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30cb0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30cc0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
30cd0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
30ce0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30d10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
30d20 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
30d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30d50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30d60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
30d70 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
30d80 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
30d90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30da0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30db0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30dc0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30dd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30de0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
30df0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
30e00 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
30e10 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
30e20 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
30e30 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
30e40 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
30e50 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
30e60 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
30e70 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
30e80 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
30e90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
30ea0 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
30eb0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
30ec0 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
30ed0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
30ee0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
30ef0 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
30f00 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
30f10 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
30f20 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
30f30 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
30f40 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
30f50 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
30f60 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
30f70 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
30f80 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
30f90 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
30fa0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
30fb0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
30fc0 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
30fd0 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
30fe0 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
30ff0 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
31000 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
31010 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
31020 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
31030 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
31040 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
31050 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
31060 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
31070 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
31080 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
31090 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
310a0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
310b0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
310c0 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
310d0 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
310e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
310f0 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
31100 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
31110 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
31120 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
31130 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
31140 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
31150 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
31160 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31170 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
31180 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
31190 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
311a0 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
311b0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
311c0 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
311d0 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
311e0 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
311f0 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
31200 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
31210 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
31220 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31230 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31240 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
31250 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
31260 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
31270 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
31280 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
31290 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
312a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
312b0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
312c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
312d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
312e0 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
312f0 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
31300 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
31310 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
31320 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
31330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31340 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31350 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31360 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
31370 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
31380 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
31390 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
313a0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
313b0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
313c0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
313d0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
313e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
313f0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
31400 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
31410 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
31420 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
31430 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
31440 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
31450 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
31460 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
31470 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
31480 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
31490 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
314a0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
314b0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
314c0 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
314d0 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
314e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
314f0 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
31500 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31510 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31520 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31530 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
31540 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
31550 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31580 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
31590 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
315a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
315b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
315c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
315d0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
315e0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
315f0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
31600 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31610 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
31620 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
31630 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
31640 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
31650 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
31660 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
31670 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
31680 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
31690 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
316a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
316b0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
316c0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
316d0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
316e0 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
316f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
31710 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31720 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31730 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31750 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
31760 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
31770 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
31780 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
31790 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
317a0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
317b0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
317c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
317d0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
317e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
317f0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
31800 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
31810 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
31820 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31830 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
31840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31850 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
31860 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
31870 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
31880 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
31890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
318a0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
318b0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
318c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
318d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
318e0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
318f0 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
31900 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
31910 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
31920 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
31930 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
31940 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
31950 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
31960 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
31970 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31980 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
31990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
319a0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
319b0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
319c0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
319d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
319e0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
319f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
31a00 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
31a10 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
31a20 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
31a30 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
31a40 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
31a50 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
31a60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31a70 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
31a80 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
31a90 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
31aa0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
31ab0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
31ac0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
31ad0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
31ae0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
31af0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31b00 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
31b10 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
31b20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
31b30 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
31b40 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
31b50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31b60 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
31b70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31b80 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
31b90 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
31ba0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31bb0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
31bc0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
31bd0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
31be0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
31bf0 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
31c00 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c20 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
31c30 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
31c40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31c70 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
31c80 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ca0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
31cb0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
31cc0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
31cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31ce0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31cf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31d00 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
31d10 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
31d20 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
31d30 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
31d40 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
31d50 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
31d60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31d70 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
31d80 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
31d90 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
31da0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31db0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
31dc0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
31dd0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
31de0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
31df0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
31e00 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
31e10 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
31e20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
31e30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31e40 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31e50 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
31e60 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
31e70 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
31e80 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
31e90 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
31ea0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31eb0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
31ec0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
31ed0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
31ee0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
31ef0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
31f00 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
31f10 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
31f20 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
31f30 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
31f40 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
31f50 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
31f60 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
31f70 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
31f80 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
31f90 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
31fa0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
31fb0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
31fc0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
31fd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31fe0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
31ff0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
32000 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
32020 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
32030 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
32040 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
32050 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
32060 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
32070 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
32080 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
32090 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
320a0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
320b0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
320c0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
320d0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
320e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
320f0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
32100 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
32110 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
32120 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32130 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
32140 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
32150 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
32160 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
32170 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
32180 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
32190 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
321a0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
321b0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
321c0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
321d0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
321e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
321f0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
32200 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
32210 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
32220 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
32230 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
32240 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
32250 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
32260 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
32270 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
32280 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
32290 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
322a0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
322b0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
322c0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
322d0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
322e0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
322f0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
32300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32310 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
32320 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
32330 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
32340 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
32350 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
32360 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
32370 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
32380 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32390 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
323a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
323b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
323c0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
323d0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
323e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
323f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
32400 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
32410 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
32420 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
32430 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
32440 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
32450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32460 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32470 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32480 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
32490 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
324a0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
324b0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
324c0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
324d0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
324e0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
324f0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
32500 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
32510 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
32520 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
32530 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
32540 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
32550 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
32560 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
32570 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
32580 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
32590 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
325a0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
325b0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
325c0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
325d0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
325e0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
325f0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
32600 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
32610 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
32620 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
32630 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32640 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
32650 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
32660 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
32670 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
32680 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
32690 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
326a0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
326b0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
326c0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
326d0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
326e0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
326f0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
32700 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
32710 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
32720 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
32730 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
32740 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
32750 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
32760 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
32770 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
32780 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
32790 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
327a0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
327b0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
327c0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
327d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
327e0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
327f0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
32800 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
32810 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32820 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
32830 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
32840 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
32850 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
32860 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
32870 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
32880 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
32890 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
328a0 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
328b0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
328c0 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
328d0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
328e0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
328f0 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
32900 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
32910 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
32920 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
32930 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32940 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32950 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32960 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32980 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32990 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
329a0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
329b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
329c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
329d0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
329e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
329f0 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
32a00 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32a10 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
32a20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32a30 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
32a40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32a50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32a60 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
32a70 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32a80 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
32a90 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
32aa0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
32ab0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
32ac0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
32ad0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
32ae0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32af0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32b00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
32b10 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
32b20 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
32b30 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
32b40 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
32b50 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
32b60 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
32b70 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
32b80 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
32b90 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
32ba0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
32bb0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
32bc0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
32bd0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
32be0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
32bf0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32c00 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
32c10 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
32c20 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
32c30 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
32c40 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
32c50 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
32c60 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
32c70 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
32c80 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
32c90 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
32ca0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
32cb0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
32cc0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32cd0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
32ce0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32cf0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
32d20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32d30 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
32d40 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
32d50 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
32d60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
32d70 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
32d80 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32d90 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
32da0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32db0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
32dc0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
32dd0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32de0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
32df0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
32e00 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
32e10 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
32e20 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32e30 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
32e40 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
32e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32e60 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
32e70 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
32e80 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
32e90 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
32ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
32eb0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
32ec0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
32ed0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
32ee0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
32ef0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
32f00 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
32f10 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
32f20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
32f30 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
32f40 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
32f50 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
32f60 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
32f70 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
32f80 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
32f90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32fa0 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
32fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
32fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32fd0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
32fe0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32ff0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
33000 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
33010 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
33020 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
33030 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
33040 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
33050 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
33060 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
33070 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
33080 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
33090 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
330a0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
330b0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
330c0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
330d0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
330e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
330f0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33100 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
33110 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
33120 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
33130 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
33140 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
33150 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66  info.nLocal==inf
33160 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
33170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33180 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
33190 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
331a0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
331b0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
331c0 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
331d0 2e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65  .nSize-1 > pPage
331e0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
331f0 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
33200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33210 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
33220 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
33230 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
33240 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
33250 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
33260 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34  + info.nSize - 4
33270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
33280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
33290 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
332a0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
332b0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
332c0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
332d0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
332e0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
332f0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
33300 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
33310 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
33320 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66  RRUPT_DB && (inf
33330 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66  o.nPayload + ovf
33340 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50  lPageSize)<ovflP
33350 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20  ageSize).  );.  
33360 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
33370 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
33380 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
33390 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
333a0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
333b0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
333c0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
333d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
333e0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
333f0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
33400 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
33410 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
33420 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
33430 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
33440 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
33450 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
33460 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
33470 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
33480 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
33490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
334a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
334b0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
334c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
334d0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
334e0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
334f0 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
33500 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33510 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
33520 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
33530 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
33540 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
33550 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
33560 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
33570 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
33580 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
33590 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
335a0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
335b0 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
335c0 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
335d0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
335e0 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
335f0 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
33600 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
33610 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
33620 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
33630 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
33640 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
33650 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
33660 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
33670 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
33680 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
33690 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
336a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
336b0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
336c0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
336d0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
336e0 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
336f0 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
33700 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
33710 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
33720 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
33730 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
33740 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
33750 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
33760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
33770 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
33780 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
33790 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
337a0 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
337b0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
337c0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
337d0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
337e0 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
337f0 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
33800 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
33810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33820 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33830 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
33840 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
33850 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
33860 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
33870 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
33880 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
33890 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
338a0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
338b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
338c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
338d0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
338e0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
338f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33900 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
33910 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
33920 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
33930 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
33940 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
33950 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
33960 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
33970 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
33980 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
33990 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
339a0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
339b0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
339c0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
339d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
339e0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
339f0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
33a00 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
33a10 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
33a20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
33a30 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
33a40 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
33a50 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
33a60 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
33a70 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
33a80 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
33a90 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
33aa0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
33ab0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
33ac0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
33ad0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
33ae0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
33af0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
33b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
33b10 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
33b20 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
33b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33b40 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
33b50 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
33b60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33b70 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
33b80 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
33b90 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
33ba0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
33bb0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
33bc0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
33bd0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
33be0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
33bf0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
33c00 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
33c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
33c30 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
33c40 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
33c50 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
33c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
33c70 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
33c80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
33c90 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
33ca0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
33cb0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
33cc0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
33cd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
33ce0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
33cf0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
33d00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
33d10 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
33d20 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
33d30 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
33d40 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
33d50 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
33d60 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
33d70 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
33d80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33d90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
33da0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
33db0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
33dc0 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
33dd0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
33de0 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
33df0 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
33e00 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
33e10 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
33e20 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
33e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
33e40 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
33e50 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
33e60 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
33e70 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
33e80 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
33e90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33ea0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
33eb0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
33ec0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
33ed0 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
33ee0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
33ef0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
33f00 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
33f10 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
33f20 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
33f30 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
33f40 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
33f50 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
33f60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33f70 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20  t( nData==0 );. 
33f80 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f     assert( nZero
33f90 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65  ==0 );.  }.  nHe
33fa0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33fb0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
33fc0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
33fd0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
33fe0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69  n the payload si
33ff0 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ze */.  if( pPag
34000 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
34010 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
34020 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
34030 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
34040 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73    }else{ .    as
34050 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66  sert( nKey<=0x7f
34060 66 66 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d  ffffff && pKey!=
34070 30 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  0 );.    nPayloa
34080 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
34090 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
340a0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
340b0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
340c0 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
340d0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
340e0 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
340f0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
34100 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
34110 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
34120 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
34130 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
34140 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
34150 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
34160 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
34170 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
34180 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
34190 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
341a0 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
341b0 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
341c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
341d0 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
341e0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
341f0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
34200 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
34210 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
34220 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
34230 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
34240 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
34250 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
34260 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
34270 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
34280 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
34290 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
342a0 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
342b0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
342c0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
342d0 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
342e0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
342f0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
34300 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
34310 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
34320 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
34330 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
34340 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
34350 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
34360 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
34370 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
34380 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
34390 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
343a0 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
343b0 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
343c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343d0 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
343e0 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
343f0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
34400 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
34410 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
34420 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
34430 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
34440 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
34450 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
34460 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
34470 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
34480 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
34490 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
344a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
344b0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
344c0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
344d0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
344e0 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
344f0 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
34500 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
34510 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
34520 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
34530 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
34540 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
34550 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
34560 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
34570 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e  nHeader=(int)(in
34580 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
34590 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
345a0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
345b0 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
345c0 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
345d0 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
345e0 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
345f0 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
34600 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
34610 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
34620 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
34630 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
34640 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
34650 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
34660 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
34670 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
34680 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
34690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
346a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
346b0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
346c0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
346d0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
346e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
346f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
34700 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34710 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34720 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
34730 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
34740 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
34750 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
34760 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
34770 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
34780 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34790 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
347a0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
347b0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
347c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
347d0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
347e0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
347f0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
34800 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34810 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
34820 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34830 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34840 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
34850 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
34860 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
34870 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
34880 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
34890 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
348a0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
348b0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
348c0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
348d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
348e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
348f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
34900 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
34910 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
34920 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
34930 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
34940 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
34950 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
34960 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
34970 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
34980 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
34990 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
349a0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
349b0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
349c0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
349d0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
349e0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
349f0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
34a00 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
34a10 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
34a20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34a30 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
34a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34a50 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
34a60 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
34a70 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
34a80 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
34a90 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
34aa0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
34ab0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
34ac0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
34ad0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34ae0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34af0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
34b00 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
34b10 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
34b20 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
34b30 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
34b40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
34b50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
34b60 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
34b70 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
34b80 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
34b90 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
34ba0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
34bb0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
34bc0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
34bd0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
34be0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
34bf0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34c00 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34c10 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34c20 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34c30 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34c40 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
34c50 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34c60 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34c70 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
34c80 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
34c90 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34ca0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
34cb0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
34cc0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
34cd0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
34ce0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34d00 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34d10 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34d20 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34d30 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34d40 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
34d50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34d60 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
34d70 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
34d80 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
34d90 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
34da0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
34db0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
34dc0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
34dd0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
34de0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
34df0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
34e00 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
34e10 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
34e20 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
34e30 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
34e40 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
34e50 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
34e60 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
34e70 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
34e80 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34e90 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
34ea0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
34eb0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
34ec0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
34ed0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
34ee0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
34ef0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34f00 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
34f10 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
34f20 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
34f30 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
34f40 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34f50 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34f60 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34f70 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
34f80 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
34f90 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
34fa0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
34fb0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
34fc0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34fd0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34fe0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34ff0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35000 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35010 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
35020 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
35030 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
35040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
35050 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
35060 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
35070 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
35080 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
35090 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
350a0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
350b0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
350c0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
350d0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
350e0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
350f0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
35100 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
35110 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
35120 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
35130 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
35140 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
35150 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
35160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
35180 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
35190 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
351a0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
351b0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
351c0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
351d0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
351e0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
351f0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
35200 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
35210 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
35220 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
35230 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
35240 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
35250 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
35260 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
35270 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
35280 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
35290 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
352a0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
352b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
352c0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
352d0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
352e0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
352f0 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
35300 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
35310 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
35320 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
35330 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
35340 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
35350 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
35360 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
35370 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
35380 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
35390 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
353a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
353b0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
353c0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
353d0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
353e0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
353f0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
35400 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
35410 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35420 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35430 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
35440 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
35450 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
35460 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
35470 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
35480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35490 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
354a0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
354b0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
354c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
354d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
354e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
354f0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
35500 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
35510 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
35520 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
35530 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
35540 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
35550 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
35560 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
35570 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
35580 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
35590 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
355a0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
355b0 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
355c0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
355d0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
355e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
355f0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
35600 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35610 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
35620 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
35630 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
35640 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
35650 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
35660 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35670 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
35680 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
35690 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
356a0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
356b0 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
356c0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
356d0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
356e0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
356f0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35700 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
35710 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
35720 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35730 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
35740 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
35750 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
35760 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
35770 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
35780 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
35790 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
357a0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
357b0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
357c0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
357d0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
357e0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
357f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
35800 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
35810 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
35820 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
35830 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
35840 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
35850 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
35860 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35870 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
35880 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
35890 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
358a0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
358b0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
358c0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
358d0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
358e0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
358f0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
35900 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
35910 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
35920 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
35930 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
35940 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
35950 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
35960 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
35970 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
35980 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
35990 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
359a0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
359b0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
359c0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
359d0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
359e0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
359f0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
35a00 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mented..*/.stati
35a10 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
35a20 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
35a30 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
35a40 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
35a50 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
35a60 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
35a70 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
35a80 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
35a90 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
35aa0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
35ab0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
35ac0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
35ad0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
35ae0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
35af0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
35b00 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
35b10 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
35b20 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
35b30 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
35b40 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
35b50 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
35b60 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
35b70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
35b80 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
35b90 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
35ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
35bb0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
35bc0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
35bd0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
35be0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
35bf0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
35c00 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
35c10 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
35c20 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
35c30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35c40 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
35c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
35c60 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
35c70 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
35c80 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
35c90 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
35ca0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
35cb0 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
35cc0 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66  nserted */..  if
35cd0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
35ce0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
35cf0 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
35d00 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
35d10 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
35d20 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
35d30 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
35d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35d50 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
35d60 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
35d70 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
35d80 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
35d90 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
35da0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
35db0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
35dc0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
35dd0 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
35de0 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
35df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
35e00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35e10 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
35e20 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
35e30 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
35e40 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
35e50 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
35e60 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
35e70 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
35e80 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
35e90 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
35ea0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
35eb0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
35ec0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
35ed0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
35ee0 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
35ef0 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
35f00 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
35f10 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
35f20 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
35f30 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
35f40 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
35f50 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
35f60 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
35f70 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
35f80 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
35f90 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50    assert( sz==pP
35fa0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
35fb0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
35fc0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
35fd0 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
35fe0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
35ff0 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
36000 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
36010 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
36020 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c  cpy(pTemp, pCell
36030 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65  , sz);.      pCe
36040 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
36050 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
36060 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
36070 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
36080 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
36090 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
360a0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
360b0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
360c0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
360d0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
360e0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
360f0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
36100 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
36110 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
36120 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
36130 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
36140 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
36150 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
36160 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
36170 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
36180 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
36190 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
361a0 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
361b0 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
361c0 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
361d0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
361e0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
361f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36200 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
36210 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
36220 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
36230 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
36240 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
36250 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
36260 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
36270 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
36280 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
36290 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
362a0 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
362b0 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  i==pPage->aiOvfl
362c0 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20  [j-1]+1 );   /* 
362d0 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65  Overflows are se
362e0 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65  quential */.  }e
362f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
36300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36310 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
36320 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
36330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36340 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
36350 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
36360 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
36370 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36380 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36390 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
363a0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
363b0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  a;.    assert( &
363c0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
363d0 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e  Offset]==pPage->
363e0 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20  aCellIdx );.    
363f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
36400 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
36410 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
36420 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
36430 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
36440 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
36450 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
36460 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
36470 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20  ing properties. 
36480 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
36490 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
364a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
364b0 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  idx >= 0 );.    
364c0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70  assert( idx >= p
364d0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
364e0 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  +2*pPage->nCell+
364f0 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  2 || CORRUPT_DB 
36500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
36510 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
36520 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
36530 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
36540 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
36550 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
36560 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
36570 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
36580 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
36590 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
365a0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
365b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
365c0 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c  ns = pPage->aCel
365d0 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20  lIdx + i*2;.    
365e0 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20  memmove(pIns+2, 
365f0 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e  pIns, 2*(pPage->
36600 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20  nCell - i));.   
36610 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20   put2byte(pIns, 
36620 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  idx);.    pPage-
36630 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a  >nCell++;.    /*
36640 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
36650 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ell count */.   
36660 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61   if( (++data[pPa
36670 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d  ge->hdrOffset+4]
36680 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67  )==0 ) data[pPag
36690 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b  e->hdrOffset+3]+
366a0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  +;.    assert( g
366b0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
366c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
366d0 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])==pPage->nCell
366e0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
366f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36700 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
36710 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
36720 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
36730 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
36740 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
36750 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36760 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
36770 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
36780 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
36790 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
367a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
367b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
367c0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
367d0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
367e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
367f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65   }.}../*.** A Ce
36800 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63  llArray object c
36810 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65 20  ontains a cache 
36820 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  of pointers and 
36830 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63  sizes for a.** c
36840 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75 65  onsecutive seque
36850 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61  nce of cells tha
36860 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20  t might be held 
36870 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
36880 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
36890 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
368a0 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
368b0 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
368c0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
368d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
368e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
368f0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
36900 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
36910 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
36920 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36930 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
36940 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
36950 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
36960 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
36970 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
36980 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
36990 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
369a0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
369b0 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
369c0 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
369d0 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
369e0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
369f0 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
36a00 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
36a10 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
36a20 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
36a30 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
36a40 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
36a50 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
36a60 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
36a70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
36a80 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
36a90 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
36aa0 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
36ab0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
36ac0 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
36ad0 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36ae0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
36af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36b00 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
36b10 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
36b20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
36b30 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
36b40 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
36b50 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
36b60 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
36b70 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
36b80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
36b90 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
36ba0 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
36bb0 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
36bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
36bd0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
36be0 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
36bf0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
36c00 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
36c10 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
36c20 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
36c30 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
36c40 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
36c50 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
36c60 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36c70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
36c80 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
36c90 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
36ca0 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
36cb0 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
36cc0 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
36cd0 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
36ce0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
36cf0 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
36d00 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
36d10 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
36d20 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
36d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
36d40 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
36d50 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
36d60 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
36d70 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
36d80 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
36d90 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
36da0 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
36db0 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
36dc0 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
36dd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
36de0 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
36df0 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
36e00 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
36e10 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
36e20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
36e30 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
36e40 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
36e50 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
36e60 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
36e70 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
36e80 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
36e90 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
36ea0 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
36eb0 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
36ec0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
36ed0 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
36ee0 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
36ef0 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
36f00 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
36f10 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
36f20 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
36f30 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
36f40 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
36f50 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
36f60 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
36f70 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
36f80 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
36f90 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
36fa0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
36fb0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
36fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fd0 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
36fe0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
36ff0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
37000 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37010 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37020 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
37030 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
37040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37050 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
37060 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
37070 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
37080 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
37090 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
370a0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
370b0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
370c0 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
370d0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
370e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
370f0 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
37100 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
37110 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
37120 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
37130 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
37140 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
37150 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
37160 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
37170 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
37180 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
37190 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
371a0 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
371b0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
371c0 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
371d0 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
371e0 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
371f0 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
37200 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
37210 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
37220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
37230 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
37240 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
37250 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
37260 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
37270 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20  aData,pEnd) ){. 
37280 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
37290 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
372a0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
372b0 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
372c0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
372d0 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d  ellptr, (pData -
372e0 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
372f0 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
37300 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65   if( pData < pCe
37310 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53  llptr ) return S
37320 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37330 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  PT;.    memcpy(p
37340 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43  Data, pCell, szC
37350 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  ell[i]);.    ass
37360 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
37370 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
37380 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
37390 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
373a0 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
373b0 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]!=pPg->xCellS
373c0 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
373d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
373e0 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
373f0 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
37400 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
37410 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
37420 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
37430 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
37440 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
37450 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
37460 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
37470 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
37480 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
37490 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
374a0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
374b0 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
374c0 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
374d0 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20   0x00;.  return 
374e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
374f0 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
37500 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
37510 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
37520 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
37530 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74  y szCell.** cont
37540 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
37550 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
37560 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
37570 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
37580 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20   to .** add the 
37590 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20  cells stored in 
375a0 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67  the array to pag
375b0 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e  e pPg. If it can
375c0 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a  not (because .**
375d0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
375e0 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74  to be defragment
375f0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65  ed before the ce
37600 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e  lls will fit), n
37610 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65  on-zero.** is re
37620 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
37630 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20  e, if the cells 
37640 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73  are added succes
37650 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a  sfully, zero is.
37660 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
37670 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c  ** Argument pCel
37680 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  lptr points to t
37690 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
376a0 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
376b0 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72  er array.** (par
376c0 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74  t of page pPg) t
376d0 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65  o populate. Afte
376e0 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d  r cell apCell[0]
376f0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
37700 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c  he.** page body,
37710 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74   a 16-bit offset
37720 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70   is written to p
37730 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20  Cellptr. And so 
37740 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  on, for each.** 
37750 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
37760 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  y. It is the res
37770 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
37780 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
37790 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ure.** that it i
377a0 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72  s safe to overwr
377b0 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66  ite this part of
377c0 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
377d0 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57  r array..**.** W
377e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
377f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
37800 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74  Data points to t
37810 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
37820 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  .** content area
37830 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66   on page pPg. If
37840 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
37850 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73   content area is
37860 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70   extended,.** *p
37870 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64  pData is updated
37880 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
37890 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68   new start of th
378a0 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a  e content area.*
378b0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
378c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c  ng..**.** Finall
378d0 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67  y, argument pBeg
378e0 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  in points to the
378f0 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
37900 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a  y following the.
37910 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70  ** end of the sp
37920 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20  ace required by 
37930 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68  this page for th
37940 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
37950 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20  rea (for.** all 
37960 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74  cells - not just
37970 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20   those inserted 
37980 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  by the current c
37990 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e  all). If the con
379a0 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73  tent.** area mus
379b0 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  t be extended to
379c0 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69   before this poi
379d0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  nt in order to a
379e0 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a  ccomodate all.**
379f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
37a00 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c  [], then the cel
37a10 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e  ls do not fit an
37a20 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  d non-zero is re
37a30 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
37a40 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74  c int pageInsert
37a50 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
37a60 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37a70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
37a80 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f   to add cells to
37a90 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e   */.  u8 *pBegin
37aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37ab0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
37ac0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
37ad0 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44  ay */.  u8 **ppD
37ae0 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
37af0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
37b00 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  T: Page content 
37b10 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f  -area pointer */
37b20 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c  .  u8 *pCellptr,
37b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b40 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
37b50 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37b60 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  ea */.  int iFir
37b70 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
37b80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
37b90 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
37ba0 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  o add */.  int n
37bb0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
37bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
37bd0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
37be0 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20   add to pPg */. 
37bf0 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
37c00 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
37c10 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37c20 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
37c30 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  ;.  u8 *aData = 
37c40 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38  pPg->aData;.  u8
37c50 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74   *pData = *ppDat
37c60 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  a;.  int iEnd = 
37c70 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
37c80 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
37c90 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72  T_DB || pPg->hdr
37ca0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
37cb0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
37cc0 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66  on page 1 */.  f
37cd0 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69  or(i=iFirst; i<i
37ce0 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  End; i++){.    i
37cf0 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75  nt sz, rc;.    u
37d00 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a  8 *pSlot;.    sz
37d10 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a   = cachedCellSiz
37d20 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20  e(pCArray, i);. 
37d30 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d     if( (aData[1]
37d40 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d  ==0 && aData[2]=
37d50 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20  =0) || (pSlot = 
37d60 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67  pageFindSlot(pPg
37d70 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a  ,sz,&rc))==0 ){.
37d80 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73        pData -= s
37d90 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  z;.      if( pDa
37da0 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75  ta<pBegin ) retu
37db0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f  rn 1;.      pSlo
37dc0 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
37dd0 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e  .    /* pSlot an
37de0 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  d pCArray->apCel
37df0 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20  l[i] will never 
37e00 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c  overlap on a wel
37e10 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20  l-formed.    ** 
37e20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74  database.  But t
37e30 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20  hey might for a 
37e40 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
37e50 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d  .  Hence use mem
37e60 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69  move().    ** si
37e70 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e  nce memcpy() sen
37e80 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68  ds SIGABORT with
37e90 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66   overlapping buf
37ea0 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20  fers on OpenBSD 
37eb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
37ec0 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72  pSlot+sz)<=pCArr
37ed0 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20  ay->apCell[i].  
37ee0 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e         || pSlot>
37ef0 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  =(pCArray->apCel
37f00 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20  l[i]+sz).       
37f10 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
37f20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
37f30 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
37f40 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
37f50 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37f60 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
37f70 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37f80 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
37f90 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
37fa0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
37fb0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37fc0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37fd0 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37fe0 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37ff0 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
38000 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
38010 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
38020 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
38030 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
38040 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
38050 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
38060 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
38070 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
38080 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
38090 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
380a0 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
380b0 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
380c0 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
380d0 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
380e0 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
380f0 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
38100 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
38110 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
38120 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
38130 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
38140 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
38150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
38160 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
38170 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
38180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38190 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
381a0 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
381b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
381d0 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
381e0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
381f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38200 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
38210 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
38220 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
38230 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
38240 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
38250 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
38260 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
38270 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
38280 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
38290 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
382a0 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
382b0 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
382c0 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
382d0 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
382e0 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
382f0 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
38300 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
38310 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
38320 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
38330 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
38340 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72  0;..  for(i=iFir
38350 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
38360 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
38370 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
38380 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51  l[i];.    if( SQ
38390 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c  LITE_WITHIN(pCel
383a0 6c 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29  l, pStart, pEnd)
383b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
383c0 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
383d0 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
383e0 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
383f0 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
38400 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
38410 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
38420 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
38430 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
38440 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
38450 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
38460 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
38470 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
38480 3d 20 70 4