/ Hex Artifact Content
Login

Artifact b8875cff2d98d662a7e25d73483bccc2374d8bdb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
55d0: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
55e0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
55f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5610: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5620: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5640: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5660: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5670: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5690: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
56a0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
56b0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
56c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
56d0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
56e0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
56f0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5700: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5710: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5720: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5730: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5740: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5750: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5760: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5770: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5780: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5790: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
57a0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
57b0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
57c0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
57d0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
57e0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
57f0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5800: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5810: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5820: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5830: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5840: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5850: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5860: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5870: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5880: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5890: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
58a0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
58b0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
58c0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
58d0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
58e0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
58f0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5900: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5910: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5920: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5930: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5940: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5950: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5960: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5970: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5980: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5990: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
59a0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
59b0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
59c0: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
59d0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
59e0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
59f0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5a00: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5a10: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5a20: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5a30: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5a40: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5a50: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5a60: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5a70: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5a80: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
5a90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
5aa0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
5ab0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
5ac0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
5ad0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
5ae0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5af0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5b00: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5b10: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5b20: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5b30: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5b40: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5b50: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5b60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5b70: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5b80: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
5b90: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5ba0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
5bb0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
5bc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
5bd0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
5be0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
5bf0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
5c00: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
5c10: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
5c20: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
5c30: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
5c40: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
5c50: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
5c60: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
5c70: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
5c80: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
5c90: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
5ca0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
5cb0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
5cc0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
5cd0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
5ce0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5cf0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
5d00: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
5d10: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
5d20: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
5d30: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
5d40: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
5d50: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5d60: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
5d70: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
5d80: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
5d90: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
5da0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5db0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
5dc0: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
5dd0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
5de0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
5df0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
5e00: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
5e10: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
5e20: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
5e30: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
5e40: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
5e50: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
5e60: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
5e70: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
5e80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5e90: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5ea0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5eb0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5ec0: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5ed0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5ef0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
5f10: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
5f20: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
5f30: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
5f40: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5f50: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5f60: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5f70: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5f80: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
5f90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
5fa0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
5fb0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
5fc0: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
5fd0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
5fe0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
5ff0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6000: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6010: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6020: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6030: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6040: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6050: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
6060: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
6070: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
6080: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6090: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
60a0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
60b0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
60c0: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
60d0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
60e0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
60f0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6100: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6110: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6120: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6130: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6140: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6150: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
6160: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
6170: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
6180: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
61a0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
61b0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
61c0: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
61d0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
61e0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
61f0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6200: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6210: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6220: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6230: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6240: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6250: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
6260: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
6270: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
6280: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6290: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
62a0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
62b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
62c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
62d0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
62e0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
62f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6300: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6330: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6340: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
6350: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
6360: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
6370: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
6380: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
6390: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
63a0: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
63b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
63c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
63d0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
63e0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
63f0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
6400: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
6410: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
6420: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6430: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
6440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6450: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
6460: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
6470: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6480: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
6490: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
64a0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
64b0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
64c0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
64d0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
64e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
64f0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
6500: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
6510: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
6520: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
6530: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6540: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
6550: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
6560: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
6570: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
6580: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
6590: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
65a0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
65b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
65c0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
65d0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
65e0: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
65f0: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
6600: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
6610: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
6620: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
6630: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
6640: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
6650: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
6660: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
6670: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
6680: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
6690: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
66a0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
66b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66d0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
66e0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
66f0: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
6700: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
6710: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
6720: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
6730: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
6740: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
6750: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
6760: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
6770: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
6780: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6790: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
67a0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
67b0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
67c0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
67d0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
67e0: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
67f0: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6800: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6810: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6820: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
6830: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
6840: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
6850: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6860: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6870: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6880: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
6890: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
68a0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
68b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
68c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
68d0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
68e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
68f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6900: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6910: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6920: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6930: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6940: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6950: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6960: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6980: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6990: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
69a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
69b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69c0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69d0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
69e0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
69f0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6a00: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6a10: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a20: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a30: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a40: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a50: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a60: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6a80: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6a90: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6aa0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6ab0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6ac0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6ad0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b00: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6b10: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b30: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b40: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b50: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b60: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6b80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6b90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6ba0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6bb0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6bc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6be0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6bf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6c00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6c10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c30: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c50: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c60: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c70: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6c80: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6c90: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6ca0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6cb0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6cc0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cd0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6ce0: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6cf0: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6d00: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6d10: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d20: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d40: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d70: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6d80: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6d90: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6da0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6db0: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6dc0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6dd0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6de0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6df0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6e00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6e10: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e20: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e30: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e40: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e50: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e60: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e70: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6e80: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6e90: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6ea0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6eb0: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ec0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6ed0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6ee0: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6ef0: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6f00: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6f10: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f20: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f30: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f40: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f50: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f60: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f70: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6f80: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6f90: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6fa0: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6fb0: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fc0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6fd0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6fe0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
6ff0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7000: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
7010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7020: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7030: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7040: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
7050: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
7060: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
7070: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7080: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
7090: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
70a0: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
70b0: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
70c0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
70d0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
70e0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
70f0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
7100: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
7110: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
7120: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
7130: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
7140: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
7150: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
7160: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
7170: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
7180: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
7190: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
71a0: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
71b0: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
71c0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
71d0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
71e0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
71f0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
7200: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
7210: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
7220: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7230: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
7240: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
7250: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
7260: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7270: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
7280: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
7290: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
72a0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
72b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
72c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
72d0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
72e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72f0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7300: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
7310: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7320: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
7330: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
7340: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
7360: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
7370: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
7380: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44  VALID ){.    *pD
7390: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
73a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
73b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
73c0: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Next==0 );.    *
73d0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
73e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7400: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7410: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7420: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7430: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7440: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7450: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7460: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7470: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7480: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7490: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
74a0: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
74b0: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
74c0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
74d0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
74e0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
74f0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7510: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7520: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7530: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7540: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7550: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7560: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7570: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7580: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7590: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
75a0: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
75b0: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
75c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
75d0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
75e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
75f0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7600: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7610: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7620: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7630: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7640: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7660: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7670: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7680: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7690: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
76a0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
76b0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
76c0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
76d0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
76e0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
76f0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7700: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7710: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7720: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7730: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7740: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7750: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7760: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7770: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7780: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
7790: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
77a0: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
77b0: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
77c0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
77d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
77e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
77f0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7800: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
7810: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
7820: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7830: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7840: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
7850: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7860: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
7870: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
7880: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
7890: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
78a0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
78b0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
78c0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
78d0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
78e0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
78f0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
7900: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
7910: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7920: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
7930: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7940: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7950: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
7960: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
7970: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7980: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
7990: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
79a0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
79b0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
79c0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
79d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
79e0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
79f0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
7a00: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
7a10: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
7a20: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
7a30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
7a40: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
7a50: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
7a60: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
7a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7a80: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
7a90: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7aa0: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
7ab0: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
7ac0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
7ad0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7ae0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7af0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7b00: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7b10: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7b20: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7b30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7b40: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7b50: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7b60: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7b70: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7b80: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7b90: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7ba0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7bb0: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
7bc0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
7bd0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
7be0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7bf0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7c00: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
7c10: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c20: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7c30: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7c40: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7c50: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7c60: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7c70: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7c80: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7c90: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7ca0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7cb0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7cc0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7cd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7ce0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7cf0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7d00: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7d10: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7d20: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7d30: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7d40: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
7d50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
7d70: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
7d80: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
7d90: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7da0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
7db0: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
7dc0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7dd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7de0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
7df0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
7e00: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7e10: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7e20: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
7e30: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7e40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7e50: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
7e60: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
7e70: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
7e80: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7e90: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
7ea0: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
7eb0: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
7ec0: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
7ed0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
7ee0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
7ef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7f00: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
7f10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f30: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7f40: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
7f50: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
7f60: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
7f70: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
7f80: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
7f90: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7fa0: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
7fb0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
7fc0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
7fd0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7fe0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
7ff0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
8000: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
8010: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8020: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8030: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8040: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8050: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8060: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8070: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8080: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8090: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
80a0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
80b0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
80c0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
80d0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
80e0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
80f0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
8100: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
8110: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8120: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8130: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
8140: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8150: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
8160: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8170: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8180: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
8190: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
81b0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
81c0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
81d0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
81e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8200: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
8210: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
8220: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
8230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8240: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
8250: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8260: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
8270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8280: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
8290: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
82a0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
82b0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
82c0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82d0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
82e0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
82f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8300: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8310: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8320: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8330: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8340: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8350: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8360: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8370: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8380: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
8390: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
83a0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
83b0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
83c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
83d0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
83e0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
83f0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
8400: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
8410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8420: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
8430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8440: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8450: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8460: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8470: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8480: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
8490: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
84a0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
84b0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
84c0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
84d0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
84e0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
84f0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
8500: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
8510: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
8520: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
8530: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8540: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8550: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8560: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8570: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8580: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
8590: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
85a0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
85b0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
85c0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
85d0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
85e0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
85f0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
8600: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
8610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8620: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
8630: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8640: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8650: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8660: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8670: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8680: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
8690: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
86a0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
86b0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
86c0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
86d0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
86e0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
86f0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8700: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8710: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8720: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
8730: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8740: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8750: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8760: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8770: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8780: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
8790: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
87a0: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
87b0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
87c0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
87d0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
87e0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
87f0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
8800: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
8810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8820: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8840: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8850: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8860: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8870: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8880: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8890: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
88a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
88b0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
88c0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
88d0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
88e0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
88f0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8900: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
8910: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8920: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8930: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8940: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8950: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8960: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8970: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8980: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8990: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
89a0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
89b0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
89c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
89d0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
89e0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
89f0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8a00: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8a10: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8a20: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8a30: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8a40: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8a50: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8a60: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8a70: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8a80: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8a90: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
8aa0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
8ab0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
8ac0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
8ad0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8ae0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8af0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8b00: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8b10: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8b20: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8b30: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8b50: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8b60: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8b70: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8b80: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
8b90: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8ba0: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
8bb0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8bc0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
8bd0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
8be0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8bf0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8c00: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8c10: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8c20: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8c30: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8c40: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8c50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8c60: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8c70: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8c80: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8c90: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8ca0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8cb0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8cc0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8cd0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
8ce0: 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64  &pInfo->pPayload
8cf0: 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20  [pInfo->nLocal] 
8d00: 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a  - pCell) + 4;.}.
8d10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8d20: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8d30: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8d40: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8d50: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8d60: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8d70: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8d80: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8d90: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8da0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8db0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8dc0: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
8dd0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8de0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
8df0: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
8e00: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
8e10: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
8e20: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
8e30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8e40: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
8e50: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
8e60: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
8e70: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
8e80: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
8e90: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
8ea0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
8eb0: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
8ec0: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
8ed0: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
8ee0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
8ef0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
8f00: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8f10: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
8f20: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
8f30: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8f40: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8f50: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8f60: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8f80: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8f90: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8fa0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8fb0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8fc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8fd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
8fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8ff0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9000: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9010: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
9020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9030: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
9040: 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =4 );.#ifndef SQ
9050: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9060: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
9070: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  age);.#endif.  p
9080: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
9090: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
90a0: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
90b0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
90c0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
90d0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
90e0: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
90f0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >pPayload = 0;. 
9100: 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69   return;.}.stati
9110: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
9120: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
9130: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9140: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9150: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9160: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9190: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
91a0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
91b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
91c0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
91d0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
91e0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
91f0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9200: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9210: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9220: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9240: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9250: 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20  /.  u64 iKey;   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9270: 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c  xtracted Key val
9280: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
9290: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
92a0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
92b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
92c0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
92d0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
92e0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
92f0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
9300: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
9310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9320: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
9330: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
9340: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9350: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9360: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9370: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9380: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
9390: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
93a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
93b0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
93c0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
93d0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
93e0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
93f0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9400: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9410: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9420: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9430: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9440: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9450: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9460: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9470: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9480: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
9490: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
94a0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
94b0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
94c0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
94d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
94e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
94f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9500: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
9510: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
9520: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9530: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9540: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9550: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
9560: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9570: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
9580: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9590: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
95a0: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
95b0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
95c0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
95d0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
95e0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
95f0: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
9600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
9610: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
9620: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
9630: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
9640: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
9650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9660: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9670: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9680: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
9690: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
96a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
96b0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96c0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
96d0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
96e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
96f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9700: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9710: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9720: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9730: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9740: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9750: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9760: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9770: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9780: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9790: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
97a0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
97b0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
97c0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
97d0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
97e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
97f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9800: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9810: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9820: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9830: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9850: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9860: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9870: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9880: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9890: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
98a0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
98b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
98c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
98d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
98e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
98f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9910: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9920: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9930: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9940: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9950: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9960: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
9970: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
9980: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
9990: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
99a0: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
99b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
99c0: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
99d0: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
99e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
99f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9a00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9a10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9a20: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9a30: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9a40: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9a50: 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70  eyLeaf==0 );.  p
9a60: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a70: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a80: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9a90: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9aa0: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9ab0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9ac0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ad0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9ae0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9af0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9b00: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9b10: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9b20: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9b30: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9b40: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9b50: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9b60: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9b70: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9b80: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9b90: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9ba0: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9bb0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9bc0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9bd0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9be0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9bf0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9c00: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9c10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9c20: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9c30: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9c40: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9c50: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9c60: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9c70: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9c80: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9c90: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9ca0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9cb0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9cc0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9cd0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9ce0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9d00: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9d10: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9d20: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9d30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9d40: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9d50: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9d60: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9d70: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9d80: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9d90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9da0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9db0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9dc0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9de0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
9df0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
9e00: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
9e10: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9e20: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9e30: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9e40: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
9e50: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
9e60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9e70: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9e80: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9e90: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9eb0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
9ec0: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
9ed0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
9ee0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
9ef0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
9f00: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
9f10: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9f20: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
9f30: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
9f40: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
9f50: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
9f60: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
9f70: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
9f80: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
9f90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
9fa0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
9fb0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
9fc0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
9fd0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
9fe0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
9ff0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
a000: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a010: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a020: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a030: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a040: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a050: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a060: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a070: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a080: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a090: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a0a0: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a0b0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0c0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0d0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a100: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a110: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a150: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a170: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a180: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a190: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a1a0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a1b0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a1c0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a1d0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a1e0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a1f0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a200: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a210: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a220: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a230: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a240: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a250: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a260: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a270: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a280: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a290: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a2a0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a2b0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a2c0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a2d0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
a2e0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
a2f0: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
a300: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a310: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a320: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a330: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a340: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a350: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a360: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a370: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a380: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a390: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a3a0: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a3b0: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a3c0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a3d0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a3e0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a3f0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a400: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a410: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a420: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a430: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a440: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a450: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a460: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a470: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a480: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a490: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a4a0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a4b0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a4d0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a4e0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a4f0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a500: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a510: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a520: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a530: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a540: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a550: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a560: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a570: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a590: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a5a0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a5b0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a5c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a5d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a5e0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a5f0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a600: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a610: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a620: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a630: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a640: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a650: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a660: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a670: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a680: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a690: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a6a0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a6b0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a6c0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a6d0: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a6e0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a6f0: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a700: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a710: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a720: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a730: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a740: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a750: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a770: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a780: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a790: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a7a0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a7c0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a7d0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a7e0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a7f0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a800: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a810: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a820: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a830: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a840: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a850: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a860: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a870: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a880: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a890: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a8a0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a8b0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a8c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a8d0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a8e0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a8f0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
a900: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
a910: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a920: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a930: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
a940: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
a950: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
a960: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a970: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
a980: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
a990: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
a9a0: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
a9b0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
a9c0: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
a9d0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
a9e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a9f0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
aa00: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
aa10: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
aa20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
aa30: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
aa40: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
aa50: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
aa60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
aa70: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
aa80: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
aa90: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
aaa0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
aab0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
aac0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aad0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
aae0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
aaf0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
ab00: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
ab10: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
ab20: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
ab30: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
ab40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
ab50: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
ab60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab80: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
ab90: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
aba0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
abb0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
abc0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
abd0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
abe0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
abf0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
ac00: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac10: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ac20: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
ac30: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
ac40: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
ac50: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
ac60: 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b  [info.nSize-4]);
ac70: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
ac80: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
ac90: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
aca0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
acb0: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
acc0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
acd0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
ace0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
acf0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
ad00: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
ad10: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
ad20: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
ad30: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
ad40: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
ad50: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
ad60: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
ad70: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
ad80: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
ad90: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ada0: 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ea..**.** EVIDEN
adb0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
adc0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
add0: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
ade0: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
adf0: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
ae00: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
ae10: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
ae20: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
ae30: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
ae40: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
ae50: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
ae60: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
ae70: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
ae80: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
ae90: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
aea0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
aec0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
aed0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
aee0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
aef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
af00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
af10: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
af20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
af30: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
af40: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
af50: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
af60: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af70: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
af80: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
af90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
afa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
afb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
afc0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
afd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
afe0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
aff0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
b000: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
b010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b020: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b030: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
b040: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b060: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b070: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
b0b0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
b0c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b0d0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
b0e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
b0f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b100: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
b110: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
b120: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
b130: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b140: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
b150: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
b160: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
b170: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
b180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
b190: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
b1a0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
b1b0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
b1c0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
b1d0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b1e0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
b1f0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
b200: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
b210: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b220: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
b230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b240: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b250: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
b260: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
b270: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b280: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
b290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b2a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b2b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b2c0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20  );.  temp = 0;. 
b2d0: 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50   src = data = pP
b2e0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
b2f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b300: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
b310: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
b320: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
b330: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
b340: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
b350: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
b360: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
b370: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
b380: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b390: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
b3a0: 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69  eSize;.  iCellFi
b3b0: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b3c0: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43   + 2*nCell;.  iC
b3d0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b3e0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28  Size - 4;.  for(
b3f0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
b400: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
b410: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
b420: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
b430: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
b440: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
b450: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
b460: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
b470: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b480: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b4a0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
b4b0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f  .    /* These co
b4c0: 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  nditions have al
b4d0: 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66  ready been verif
b4e0: 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74  ied in btreeInit
b4f0: 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66  Page().    ** if
b500: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
b510: 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20  e_check=ON..    
b520: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
b530: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
b540: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
b550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b560: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b570: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
b580: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
b590: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
b5a0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
b5b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
b5c0: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
b5d0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
b5e0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
b5f0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
b600: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
b610: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b620: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b630: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b640: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
b650: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
b660: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
b670: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
b680: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
b690: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
b6a0: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
b6b0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
b6c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
b6d0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20  ddr, cbrk);.    
b6e0: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20  if( temp==0 ){. 
b6f0: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
b700: 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29    if( cbrk==pc )
b710: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b720: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
b730: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
b740: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
b750: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  );.      x = get
b760: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b770: 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  5]);.      memcp
b780: 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74  y(&temp[x], &dat
b790: 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65  a[x], (cbrk+size
b7a0: 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72  ) - x);.      sr
b7b0: 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a  c = temp;.    }.
b7c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b7d0: 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d  [cbrk], &src[pc]
b7e0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61  , size);.  }.  a
b7f0: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65  ssert( cbrk>=iCe
b800: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74  llFirst );.  put
b810: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b820: 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74  5], cbrk);.  dat
b830: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
b840: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
b850: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
b860: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
b870: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
b880: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
b890: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
b8a0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
b8b0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b8c0: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
b8d0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
b8e0: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
b8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
b920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b930: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
b940: 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70  e-list on page p
b950: 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20  Pg for space to 
b960: 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79  store a cell nBy
b970: 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73  te bytes in.** s
b980: 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20  ize. If one can 
b990: 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
b9a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b9b0: 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f  e space and remo
b9c0: 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  ve it.** from th
b9d0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
b9e0: 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
b9f0: 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66  e space can be f
ba00: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65  ound on the free
ba10: 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55  -list, return NU
ba20: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  LL..**.** This f
ba30: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65  unction may dete
ba40: 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  ct corruption wi
ba50: 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f  thin pPg.  If co
ba60: 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64  rruption is.** d
ba70: 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52  etected then *pR
ba80: 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  c is set to SQLI
ba90: 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e  TE_CORRUPT and N
baa0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bab0: 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20  .**.** Slots on 
bac0: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68  the free list th
bad0: 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31  at are between 1
bae0: 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72   and 3 bytes lar
baf0: 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a  ger than nByte.*
bb00: 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  * will be ignore
bb10: 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20  d if adding the 
bb20: 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74  extra space to t
bb30: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
bb40: 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73   count.** causes
bb50: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69   the fragmentati
bb60: 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65  on count to exce
bb70: 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  ed 60..*/.static
bb80: 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f   u8 *pageFindSlo
bb90: 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20  t(MemPage *pPg, 
bba0: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
bbb0: 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  pRc){.  const in
bbc0: 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
bbd0: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63  Offset;.  u8 * c
bbe0: 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
bbf0: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->aData;.  int i
bc00: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  Addr = hdr + 1;.
bc10: 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62    int pc = get2b
bc20: 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72  yte(&aData[iAddr
bc30: 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69  ]);.  int x;.  i
bc40: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
bc50: 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
bc60: 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
bc70: 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20   pc>0 );.  do{. 
bc80: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bca0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
bcb0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   */.    /* EVIDE
bcc0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d  NCE-OF: R-06866-
bcd0: 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73  39125 Freeblocks
bce0: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e   are always conn
bcf0: 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f  ected in order o
bd00: 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73  f.    ** increas
bd10: 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20  ing offset. */. 
bd20: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
bd30: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64  Size-4 || pc<iAd
bd40: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70  dr+4 ){.      *p
bd50: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
bd60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bd80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bd90: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
bda0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
bdb0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
bdc0: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
bdd0: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
bde0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
bdf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
be00: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
be10: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
be20: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
be30: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
be40: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
be50: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
be60: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
be70: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
be80: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
be90: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
bea0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
beb0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
bec0: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
bed0: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
bee0: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
bef0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
bf00: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
bf10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bf20: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
bf30: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
bf40: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
bf50: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bf60: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
bf70: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
bf80: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
bf90: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
bfa0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
bfb0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
bfc0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
bfd0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
bfe0: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
bff0: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
c000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
c010: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
c020: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
c030: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
c040: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
c050: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
c060: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c070: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
c080: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
c090: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
c0a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
c0b0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
c0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c0d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
c0e0: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
c0f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
c100: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
c110: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
c120: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
c130: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
c140: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
c150: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
c160: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
c170: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
c180: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
c190: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
c1a0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
c1b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c1c0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
c1d0: 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a    }while( pc );.
c1e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c1f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
c200: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
c210: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
c220: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
c230: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
c240: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
c250: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
c260: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
c270: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
c280: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
c290: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
c2a0: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
c2b0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
c2c0: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
c2d0: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
c2e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
c2f0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
c300: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
c310: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
c320: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
c330: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
c340: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
c350: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
c360: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
c370: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
c380: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
c390: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
c3a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c3b0: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
c3c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
c3d0: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
c3e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
c3f0: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
c400: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
c410: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
c420: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
c430: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
c440: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
c450: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
c460: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
c470: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
c480: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
c490: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
c4a0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
c4b0: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
c4c0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c4d0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c4e0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
c4f0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
c500: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
c510: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
c520: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
c530: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c540: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
c550: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c580: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
c590: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
c5a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5b0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c5c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
c5d0: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
c5e0: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
c5f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c600: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
c610: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
c620: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
c630: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
c640: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c650: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c660: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
c670: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
c680: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c690: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c6a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c6b0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
c6c0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
c6d0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
c6e0: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
c6f0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
c700: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
c710: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
c720: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
c730: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
c740: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
c750: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
c760: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c770: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
c780: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
c790: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
c7a0: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
c7b0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
c7c0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
c7d0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
c7e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
c7f0: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
c800: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
c810: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
c820: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
c830: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
c840: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
c850: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
c860: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
c870: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
c880: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
c890: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
c8a0: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
c8b0: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
c8c0: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
c8d0: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
c8e0: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
c8f0: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
c900: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
c910: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
c920: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
c930: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
c940: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
c950: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
c960: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
c970: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c980: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
c990: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
c9a0: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
c9b0: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
c9c0: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
c9d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c9e0: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
c9f0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
ca00: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
ca10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ca30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ca40: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
ca50: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
ca60: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
ca70: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
ca80: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
ca90: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
caa0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
cab0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
cac0: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
cad0: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
cae0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
caf0: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
cb00: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
cb10: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
cb20: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cb30: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
cb40: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
cb50: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
cb60: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
cb70: 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c  ( (data[hdr+2] |
cb80: 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26  | data[hdr+1]) &
cb90: 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  & gap+2<=top ){.
cba0: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
cbb0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
cbc0: 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  age, nByte, &rc)
cbd0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
cbe0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cbf0: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
cc00: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
cc10: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
cc20: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
cc30: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
cc40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cc50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
cc60: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cc70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cc80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
cc90: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
cca0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
ccb0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
ccc0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
ccd0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
cce0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
ccf0: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
cd00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
cd10: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
cd20: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
cd30: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >top ){.    asse
cd40: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
cd50: 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  >0 || CORRUPT_DB
cd60: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
cd70: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
cd80: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
cd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cda0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
cdb0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
cdc0: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
cdd0: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
cde0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
cdf0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
ce00: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
ce10: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
ce20: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ce30: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ce40: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ce50: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ce60: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ce70: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
ce80: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
ce90: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
cea0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
ceb0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
cec0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
ced0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
cee0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
cef0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
cf00: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
cf10: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
cf20: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
cf30: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
cf40: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
cf50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cf60: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
cf70: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
cf80: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
cf90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cfa0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
cfb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cfc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
cfd0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
cfe0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
cff0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
d000: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
d010: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
d020: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
d030: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
d040: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
d050: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
d060: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
d070: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
d080: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
d090: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
d0a0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
d0b0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
d0c0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
d0d0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
d0e0: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
d0f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
d100: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
d110: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
d120: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
d130: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
d140: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
d150: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
d160: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
d170: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
d180: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
d190: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
d1a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
d1b0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
d1c0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
d1d0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d1f0: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
d200: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
d210: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
d220: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
d230: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
d240: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
d250: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d280: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
d290: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
d2a0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
d2d0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
d2e0: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d310: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
d320: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
d330: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
d360: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
d370: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
d380: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
d3b0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
d3c0: 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67  u32 iLast = pPag
d3d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d3e0: 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74  ze-4; /* Largest
d3f0: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
d400: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
d410: 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
d420: 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
d430: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
d440: 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
d450: 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
d460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
d470: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d480: 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
d490: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
d4a0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
d4b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d4c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d4d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d4e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d4f0: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
d500: 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
d510: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
d520: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
d540: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
d550: 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
d560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d580: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d590: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
d5b0: 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
d5c0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d5d0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d5e0: 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b  iStart<=iLast );
d5f0: 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  ..  /* Overwrite
d600: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
d610: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
d620: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
d630: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69  delete.  ** opti
d640: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
d650: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
d660: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
d670: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
d680: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
d690: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
d6a0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
d6b0: 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
d6c0: 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
d6d0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
d6e0: 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
d6f0: 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
d700: 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
d710: 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
d720: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
d730: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d740: 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
d750: 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
d760: 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
d770: 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
d780: 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
d790: 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
d7a0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
d7b0: 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
d7c0: 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
d7d0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
d7e0: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
d7f0: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
d800: 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b  ))>0 && iFreeBlk
d810: 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  <iStart ){.     
d820: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50   if( iFreeBlk<iP
d830: 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51  tr+4 ) return SQ
d840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d850: 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20  T;.      iPtr = 
d860: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
d870: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d880: 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20  >iLast ) return 
d890: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d8a0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d8b0: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
d8c0: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
d8d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
d8e0: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
d8f0: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
d900: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
d910: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
d920: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
d930: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
d940: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
d950: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
d960: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
d970: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
d980: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
d990: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
d9a0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
d9b0: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
d9c0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
d9d0: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
d9e0: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
d9f0: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
da00: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
da10: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
da20: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
da30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
da40: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
da50: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
da60: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
da70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
da80: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
da90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  ->usableSize ) r
daa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dab0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
dac0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
dad0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
dae0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
daf0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
db00: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
db10: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
db20: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
db30: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
db40: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
db50: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
db60: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
db70: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
db80: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
db90: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
dba0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
dbb0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
dbc0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
dbd0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
dbe0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
dbf0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
dc00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
dc10: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
dc20: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
dc30: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
dc40: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
dc50: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dc70: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
dc80: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
dc90: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
dca0: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
dcb0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
dcc0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
dcd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
dce0: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
dcf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dd00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dd10: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
dd20: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
dd30: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
dd40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
dd50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
dd60: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
dd70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
dd80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
dd90: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
dda0: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
ddb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ddc0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
ddd0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
dde0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
ddf0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
de00: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
de20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
de30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
de40: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
de50: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
de60: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
de70: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
de80: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
de90: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
dea0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
deb0: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
dec0: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ded0: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
dee0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
def0: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
df00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
df10: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
df20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
df30: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
df40: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
df50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
df60: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
df70: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
df80: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
df90: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
dfa0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
dfb0: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
dfc0: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
dfd0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
dfe0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
dff0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
e000: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
e010: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
e020: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
e030: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
e040: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
e050: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
e060: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
e070: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e080: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
e090: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
e0a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
e0b0: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
e0c0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e0d0: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
e0e0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e0f0: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
e100: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
e110: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
e120: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
e130: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
e140: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
e150: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
e160: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
e170: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
e180: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
e190: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e1a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e1b0: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
e1c0: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
e1d0: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
e1e0: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
e1f0: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
e200: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
e210: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
e220: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
e230: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
e240: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e250: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
e260: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e270: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
e280: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
e290: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
e2a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e2b0: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
e2c0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
e2d0: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
e2e0: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
e2f0: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
e300: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e320: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e330: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e340: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e350: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
e360: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
e370: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
e380: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
e390: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
e3a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e3b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e3c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e3d0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e3e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e3f0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e400: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e410: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e420: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e430: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e440: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e450: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
e460: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
e470: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e480: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e490: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e4a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e4b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e4c0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e4d0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e4e0: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e4f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e500: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e510: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e520: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e530: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e540: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e550: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e570: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
e580: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
e590: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e5a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
e5b0: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
e5c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e5d0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e5e0: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e5f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e600: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
e610: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
e620: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
e630: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
e640: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
e650: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e660: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e670: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e680: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e690: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e6a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e6b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e6c0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e6d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
e6e0: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
e6f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
e700: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
e710: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e720: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
e730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
e740: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
e750: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
e760: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
e770: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
e780: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
e790: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
e7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e7b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
e7c0: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
e7d0: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
e7e0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
e7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e800: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
e810: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
e820: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
e830: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
e840: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
e850: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e860: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
e870: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
e880: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
e890: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
e8a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
e8b0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
e8c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
e8d0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
e8e0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
e8f0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
e900: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
e910: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
e920: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
e930: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
e940: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
e950: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
e960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e970: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
e980: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
e990: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e9a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
e9b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
e9c0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e9d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e9e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e9f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
ea00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
ea10: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
ea20: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
ea30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
ea40: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
ea50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ea60: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ea70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ea80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ea90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
eaa0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
eab0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
eac0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ead0: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
eae0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
eaf0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
eb00: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
eb10: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
eb20: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
eb30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
eb40: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
eb50: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
eb60: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
eb70: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
eb80: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
eb90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
eba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ebb0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ebc0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
ebd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ebe0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ebf0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ec00: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
ec10: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ec20: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ec30: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ec40: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ec50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ec60: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ec70: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ec80: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ec90: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
eca0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ecb0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ecc0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ecd0: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ece0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
ecf0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
ed00: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ed10: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
ed20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
ed30: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
ed40: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ed50: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ed60: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
ed70: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
ed80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ed90: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
eda0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
edb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
edc0: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
edd0: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
ede0: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
edf0: 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
ee00: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
ee10: 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ype. */.    if( 
ee20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
ee30: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
ee40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ee50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ee60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
ee70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
ee80: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
ee90: 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  36 );.    pPage-
eea0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
eeb0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
eec0: 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  - 1);.    pPage-
eed0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
eee0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
eef0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ef00: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
ef10: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
ef20: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  fset = hdr + 8 +
ef30: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
ef40: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ef50: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
ef60: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
ef70: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
ef80: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
ef90: 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67  ffset];.    pPag
efa0: 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
efb0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
efc0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f  dPtrSize];.    /
efd0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
efe0: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
eff0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f000: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
f010: 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20  signates.    ** 
f020: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f030: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f040: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f050: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f060: 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65  r is.    ** inte
f070: 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
f080: 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67  . */.    top = g
f090: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f0a0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f0b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f0c0: 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
f0d0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f0e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
f0f0: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f100: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
f110: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
f120: 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  /.    pPage->nCe
f130: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
f140: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
f150: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
f160: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
f170: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
f180: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
f190: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
f1a0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
f1b0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
f1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f1d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f1e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f1f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
f200: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20  CELL(pBt) );.   
f210: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f220: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
f230: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
f240: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
f250: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  h is only.    **
f260: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
f270: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
f280: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
f290: 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
f2a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73   the.    ** offs
f2b0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
f2c0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
f2d0: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
f2e0: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
f2f0: 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72     ** bytes of r
f300: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
f310: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
f320: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
f330: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
f340: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
f350: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
f360: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f370: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
f380: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
f390: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
f3a0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
f3b0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
f3c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
f3d0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
f3e0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
f3f0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
f400: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
f410: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
f420: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
f430: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
f440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
f450: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
f460: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
f470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
f480: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
f490: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f4a0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
f4b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
f4c0: 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42   - 4;.    if( pB
f4d0: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
f4e0: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
f4f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
f500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f510: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
f520: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f530: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
f540: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
f550: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
f560: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
f570: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f580: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
f590: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
f5a0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f5b0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
f5c0: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
f5d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
f5e0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f5f0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
f600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
f610: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f620: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
f630: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f640: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f650: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
f660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f670: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f680: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
f690: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
f6a0: 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
f6b0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
f6c0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
f6d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f6e0: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
f6f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f720: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f740: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f750: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
f760: 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }  ..    /* Comp
f770: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
f780: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
f790: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
f7a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
f7b0: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
f7c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f7d0: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
f7e0: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
f7f0: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
f800: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
f810: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
f820: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
f830: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
f840: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
f850: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f860: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
f870: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
f880: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
f890: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
f8a0: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
f8b0: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  /.    while( pc>
f8c0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
f8d0: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
f8e0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f8f0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f900: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
f910: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f920: 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61  55530-52930 In a
f930: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
f940: 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20  ree page, there 
f950: 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  will.        ** 
f960: 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61  always be at lea
f970: 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f  st one cell befo
f980: 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65  re the first fre
f990: 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  eblock..        
f9a0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 72  **.        ** Or
f9b0: 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  , the freeblock 
f9c0: 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  is off the end o
f9d0: 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  f the page.     
f9e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
f9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fa00: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
fa10: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
fa20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
fa30: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
fa40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
fa50: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
fa60: 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65  f( (next>0 && ne
fa70: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c  xt<=pc+size+3) |
fa80: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
fa90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
faa0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
fab0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
fac0: 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74  ing order. And t
fad0: 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
fae0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
faf0: 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c  ree-block must l
fb00: 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ie on the databa
fb10: 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  se page.  */.   
fb20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fb30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fb40: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
fb50: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
fb60: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
fb70: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
fb80: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fb90: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
fba0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
fbb0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
fbc0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
fbd0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
fbe0: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
fbf0: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
fc00: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
fc10: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
fc20: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
fc30: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
fc40: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
fc50: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
fc60: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
fc70: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
fc80: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
fc90: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
fca0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
fcb0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
fcc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
fcd0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
fce0: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
fcf0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
fd00: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
fd10: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
fd20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
fd30: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
fd40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fd50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fd60: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
fd70: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
fd80: 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
fd90: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50  llFirst);.    pP
fda0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
fdb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fdc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fdd0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
fde0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
fdf0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
fe00: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
fe10: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
fe20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe30: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
fe40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
fe50: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
fe60: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
fe70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
fe80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
fe90: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
fea0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
feb0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
fec0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
fed0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fee0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fef0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
ff00: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
ff10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ff20: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ff30: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
ff40: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
ff50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ff60: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ff70: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
ff80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff90: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
ffa0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
ffb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
ffc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ffd0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ffe0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
fff0: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
10000 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
10010 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
10020 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
10030 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
10040 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
10050 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
10060 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
10070 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
10080 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
10090 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
100a0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
100b0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
100c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
100d0 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
100e0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
100f0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
10100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10110 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
10120 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
10130 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
10140 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
10150 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
10160 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
10170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
10180 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
10190 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
101a0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
101b0 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
101c0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
101d0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
101e0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
101f0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
10200 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
10210 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
10220 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
10230 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
10240 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
10250 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
10260 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
10270 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
10280 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
10290 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
102a0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
102b0 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
102c0 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
102d0 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
102e0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
102f0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
10300 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
10310 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
10320 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
10330 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
10340 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
10350 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
10360 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
10370 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
10380 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
10390 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
103a0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
103b0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
103c0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
103d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
103e0 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
103f0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
10400 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
10410 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10420 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
10430 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10440 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
10450 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10460 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
10470 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
10480 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
10490 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
104a0 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
104b0 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
104c0 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
104d0 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
104e0 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
104f0 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
10500 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
10510 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10520 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
10530 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
10540 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
10550 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
10560 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
10570 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
10580 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
10590 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
105a0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
105b0 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
105c0 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
105d0 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
105e0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
105f0 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
10600 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
10610 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
10620 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
10630 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
10640 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
10650 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
10660 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
10670 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
10680 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
10690 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
106a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
106b0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
106c0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
106d0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
106e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
106f0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
10700 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10710 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
10720 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
10730 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
10740 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
10750 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
10760 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
10770 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
10780 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
10790 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
107a0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
107b0 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
107c0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
107d0 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
107e0 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
107f0 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
10800 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10810 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10820 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
10830 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
10840 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
10850 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
10860 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
10870 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10880 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
10890 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
108a0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
108b0 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
108c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
108d0 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
108e0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
108f0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
10900 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
10910 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
10920 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
10930 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
10940 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
10950 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10960 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10970 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10980 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
10990 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
109a0 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
109b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
109c0 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
109d0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
109e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
109f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10a00 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
10a10 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
10a20 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
10a30 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
10a40 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
10a50 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
10a60 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
10a70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
10a80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
10aa0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
10ab0 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
10ac0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
10ad0 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
10ae0 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
10af0 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
10b00 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
10b10 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
10b20 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10b30 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
10b40 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
10b50 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
10b60 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
10b70 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
10b80 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
10b90 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
10ba0 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
10bb0 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
10bc0 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
10bd0 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
10be0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
10bf0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10c00 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
10c10 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
10c20 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
10c30 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
10c40 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
10c50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
10c60 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
10c70 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
10c80 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
10c90 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
10ca0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
10cb0 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
10cc0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
10cd0 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
10ce0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
10cf0 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
10d00 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
10d10 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
10d20 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
10d30 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
10d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10d50 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
10d60 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
10d70 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
10d80 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
10d90 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
10da0 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
10db0 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
10dc0 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
10dd0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10de0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
10e10 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10e40 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
10e50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10e60 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
10e70 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
10e80 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
10e90 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
10ea0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
10eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10ec0 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
10ed0 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
10ee0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
10ef0 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
10f00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10f10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
10f20 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
10f30 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10f40 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
10f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10f60 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10f70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
10f80 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
10f90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
10fa0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
10fb0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
10fc0 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
10fd0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
10fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10ff0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
11000 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
11010 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
11020 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
11030 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11040 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
11050 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11060 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
11070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11080 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11090 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
110a0 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
110b0 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
110c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
110d0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
110e0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
110f0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11100 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11110 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
11120 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
11130 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
11140 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11150 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11160 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
11170 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
11180 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
111a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
111d0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
111e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
111f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
11200 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
11210 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
11220 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
11230 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
11240 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
11250 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
11260 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
11270 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
11280 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
11290 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
112a0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
112b0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
112c0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
112d0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
112e0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
112f0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
11300 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
11310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11320 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  KPT;.    release
11330 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
11340 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11350 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11360 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11370 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69  E_OK;..getAndIni
11380 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69  tPage_error:.  i
11390 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e  f( pCur ) pCur->
113a0 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63  iPage--;.  testc
113b0 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
113c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
113d0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
113e0 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
113f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11400 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
11410 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
11420 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
11430 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
11440 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
11450 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
11460 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11470 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
11480 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
11490 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
114a0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
114b0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
114c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
114d0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
114e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
114f0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11500 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11510 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11530 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11540 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
11550 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
11560 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11570 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11580 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11590 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
115a0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
115b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
115c0 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
115d0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
115e0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
115f0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
11600 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
11610 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
11620 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
11630 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
11640 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
11650 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
11660 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
11670 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
11680 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
11690 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
116a0 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
116b0 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
116c0 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
116d0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
116e0 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
116f0 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
11700 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
11710 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
11720 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
11730 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
11740 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
11750 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
11760 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
11770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11780 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11790 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
117a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
117b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
117c0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
117d0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
117e0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
117f0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
11800 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
11810 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
11820 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
11830 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
11840 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
11850 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
11860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11870 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11880 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
11890 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
118a0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
118b0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
118c0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
118d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
118e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
118f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
11900 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
11910 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
11920 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
11930 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
11940 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
11950 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
11960 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
11970 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
11980 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
11990 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
119a0 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
119b0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
119c0 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
119d0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
119e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
119f0 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
11a00 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
11a10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
11a20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11a30 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
11a40 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
11a50 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
11a60 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
11a70 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
11a80 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
11a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11aa0 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
11ab0 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
11ac0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
11ad0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11ae0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
11af0 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
11b00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11b10 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
11b20 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
11b30 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
11b40 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
11b50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11b60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
11b70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
11b80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
11b90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11ba0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
11bb0 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
11bc0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
11bd0 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
11be0 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
11bf0 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
11c00 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
11c10 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
11c20 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
11c30 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
11c40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
11c50 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
11c60 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
11c70 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
11c80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11c90 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
11ca0 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
11cb0 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
11cc0 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
11cd0 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
11ce0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
11cf0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
11d00 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
11d10 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
11d20 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
11d30 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
11d40 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
11d50 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
11d60 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
11d70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
11d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
11d90 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11da0 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
11db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
11dc0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
11dd0 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
11de0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11df0 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
11e00 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
11e10 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
11e20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11e30 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
11e40 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
11e50 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
11e60 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
11e70 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
11e80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
11e90 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11ea0 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
11eb0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
11ec0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11ed0 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
11ee0 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
11ef0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
11f00 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
11f10 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
11f20 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
11f30 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
11f40 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
11f50 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
11f60 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
11f70 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
11f80 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
11f90 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11fa0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
11fb0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
11fc0 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
11fd0 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
11fe0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
11ff0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
12000 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
12010 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
12020 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
12030 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
12040 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
12050 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
12060 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
12070 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
12080 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
12090 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
120a0 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
120b0 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
120c0 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
120d0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
120e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
120f0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
12100 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
12120 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
12130 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
12140 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
12150 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
12160 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
12170 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
12180 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
12190 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
121a0 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
121b0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
121c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
121d0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
121e0 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
121f0 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
12200 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
12210 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
12220 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12230 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
12240 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
12250 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
12260 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12270 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12280 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
12290 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
122a0 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
122b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
122c0 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
122d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
122e0 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
122f0 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
12300 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
12310 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
12320 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
12330 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12340 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
12350 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12360 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12370 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12380 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
12390 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
123a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
123b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
123c0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
123d0 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
123e0 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
123f0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
12400 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
12410 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
12420 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
12430 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
12440 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
12450 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
12460 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
12470 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12480 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
12490 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
124a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
124b0 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
124c0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
124d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
124e0 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
124f0 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
12500 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
12510 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
12520 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
12530 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
12540 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
12550 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
12560 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12570 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
12580 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
12590 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
125a0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
125b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
125c0 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
125d0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
125e0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
125f0 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
12600 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
12610 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
12620 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12630 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
12640 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
12650 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
12660 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12670 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
12680 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12690 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
126a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126b0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
126c0 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
126d0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126f0 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
12700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
12710 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
12720 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
12730 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
12740 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
12750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12770 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12780 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
12790 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
127a0 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
127b0 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
127c0 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
127d0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
127e0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
127f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
12800 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
12810 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
12820 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
12830 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
12840 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
12850 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
12860 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
12870 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
12880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
12890 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
128a0 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
128b0 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
128c0 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
128d0 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
128e0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
128f0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12900 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
12910 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
12920 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
12930 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
12940 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
12950 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
12960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
12970 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
12980 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
12990 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
129a0 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
129b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
129c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
129d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
129e0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
129f0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
12a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12a10 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
12a20 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
12a30 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
12a40 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
12a50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12a60 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12a70 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12a90 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
12aa0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
12ab0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
12ac0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
12ad0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
12ae0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
12af0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
12b00 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
12b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
12b20 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
12b30 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
12b40 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
12b50 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
12b60 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
12b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12b80 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
12b90 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
12ba0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12bb0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
12bc0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
12bd0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12be0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
12bf0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12c00 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12c10 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12c20 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12c30 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12c40 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12c50 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
12c60 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
12c70 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12c80 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
12c90 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
12ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12cb0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12cc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12cd0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
12ce0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
12cf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
12d00 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
12d10 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12d20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12d30 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12d40 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12d50 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12d60 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12d90 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12da0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12db0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12dd0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
12de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12df0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12e10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12e20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12e30 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12e40 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12e50 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12e60 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12e70 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12e80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12e90 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12ea0 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12eb0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
12ec0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
12ed0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
12ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ef0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
12f00 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
12f10 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12f20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12f30 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12f40 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12f50 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12f70 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12f80 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12f90 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12fa0 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12fb0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
12fc0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
12fd0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
12fe0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
12ff0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
13000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
13010 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
13020 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
13030 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
13040 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
13050 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
13060 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13070 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
13080 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
13090 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
130a0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
130b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
130c0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
130d0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
130e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
130f0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13100 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
13110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13120 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
13150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
13170 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
13180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13190 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
131a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
131b0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
131c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
131d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
131e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
131f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13200 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13210 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13220 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13230 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
13240 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
13250 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
13260 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
13270 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
13280 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
13290 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
132a0 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
132b0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
132c0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
132d0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
132e0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
132f0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
13300 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
13310 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
13320 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
13330 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
13340 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
13350 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
13360 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13370 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
13380 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
13390 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
133a0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
133b0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
133c0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
133d0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
133e0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
133f0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
13400 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
13410 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
13420 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
13430 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
13440 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
13450 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
13460 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
13470 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13480 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
13490 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
134a0 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
134b0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
134c0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
134d0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
134e0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
134f0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
13500 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
13510 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13520 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
13530 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
13540 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
13550 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
13560 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13570 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13580 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13590 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
135a0 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
135b0 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
135e0 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
135f0 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
13600 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
13610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13620 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13630 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
13640 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
13650 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
13660 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
13670 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
13680 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
13690 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
136a0 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
136b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136c0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
136d0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
136e0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
136f0 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
13700 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
13710 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
13720 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
13730 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
13740 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
13750 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
13760 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
13770 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
13780 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
13790 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
137a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
137b0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
137c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
137d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
137e0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
137f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
13800 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
13810 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13820 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
13830 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
13840 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13850 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
13860 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
13870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13880 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
13890 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
138a0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
138b0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
138c0 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
138d0 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
138e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
138f0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
13900 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13910 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
13920 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
13930 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
13940 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
13950 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
13960 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
13970 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
13980 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
13990 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
139a0 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
139b0 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
139c0 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
139d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
139e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
139f0 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
13a00 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
13a10 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
13a20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
13a30 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
13a40 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
13a50 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
13a60 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
13a70 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
13a80 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
13a90 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
13aa0 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
13ab0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
13ac0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
13ad0 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
13ae0 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
13af0 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
13b00 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
13b10 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
13b20 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
13b30 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
13b40 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
13b50 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
13b60 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
13b70 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
13b80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
13b90 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
13ba0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13bb0 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
13bd0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
13be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13bf0 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
13c00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
13c10 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
13c20 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
13c30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
13c40 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
13c50 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
13c60 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
13c70 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
13c80 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
13c90 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
13ca0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
13cb0 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
13cc0 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
13cd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
13ce0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
13cf0 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
13d00 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
13d10 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
13d20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
13d30 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
13d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13d60 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13d70 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13d80 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
13d90 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
13da0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13db0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
13dc0 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
13dd0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
13de0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13df0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
13e00 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
13e10 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
13e20 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
13e30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
13e40 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13e50 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
13e60 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
13e70 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
13e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
13e90 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
13ea0 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
13eb0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
13ec0 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
13ed0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13ee0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13ef0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13f00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
13f10 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
13f20 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
13f30 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
13f40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
13f50 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
13f60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13f70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
13f80 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13f90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13fa0 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
13fb0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
13fc0 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   1;.      MUTEX_
13fd0 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
13fe0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
13ff0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14000 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
14010 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
14020 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14030 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
14040 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
14050 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
14060 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
14070 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14080 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
14090 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
140a0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
140b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
140c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
140d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
140e0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
140f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14110 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
14120 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
14130 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
14140 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14150 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14160 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
14170 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14180 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14190 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
141a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
141b0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
141c0 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
141d0 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
141e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
141f0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14200 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14210 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
14220 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
14230 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
14240 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
14250 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
14260 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
14270 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
14280 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
14290 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
142a0 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
142b0 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
142c0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
142d0 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
142e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
142f0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14300 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
14310 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
14320 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14340 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
14350 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
14360 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
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 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
14390 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
143a0 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
143b0 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70  (uptr)p->pBt<(up
143c0 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  tr)pSib->pBt ){.
143d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
143e0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
143f0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
14400 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
14410 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
14420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14430 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
14440 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70  ib->pNext && (up
14450 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  tr)pSib->pNext->
14460 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74  pBt<(uptr)p->pBt
14470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14480 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
14490 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
144a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
144b0 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
144c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
144d0 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
144e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
144f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
14500 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14510 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
14520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
14530 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
14540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14560 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14570 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
14580 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
14590 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
145a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
145b0 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
145c0 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
145d0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
145e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
145f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
14600 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
14610 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
14620 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
14630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
14640 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
14650 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
14660 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
14670 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14680 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
14690 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
146a0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
146b0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
146c0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
146d0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
146e0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
146f0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
14700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14710 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
14720 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
14730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14740 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
14750 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
14760 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14770 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
14780 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
14790 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
147a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
147b0 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
147c0 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
147d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
147e0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
147f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14800 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
14810 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
14820 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
14830 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
14840 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
14850 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
14860 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
14870 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
14880 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
14890 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
148a0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
148b0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
148c0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
148d0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
148e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
148f0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
14900 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
14910 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
14920 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14930 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
14940 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
14950 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
14960 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
14970 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
14980 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
14990 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
149a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
149b0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
149c0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
149d0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
149e0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
149f0 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
14a00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14a10 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
14a20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
14a30 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
14a40 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
14a50 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14a60 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14a70 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
14a80 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14a90 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14aa0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
14ab0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
14ac0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
14ad0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14ae0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14af0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14b00 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
14b10 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
14b20 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
14b30 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
14b40 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
14b50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
14b60 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
14b70 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
14b80 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
14b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ba0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
14bb0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
14bc0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14bd0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
14be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
14bf0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
14c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14c10 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
14c20 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
14c30 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
14c40 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14c50 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
14c60 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
14c70 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
14c80 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
14c90 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
14ca0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
14cb0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
14cc0 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
14cd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
14ce0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
14cf0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
14d00 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
14d10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14d20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14d30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14d40 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
14d50 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
14d60 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
14d70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14d80 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
14d90 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
14da0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
14db0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
14dc0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
14dd0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
14de0 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
14df0 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
14e00 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
14e10 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
14e20 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
14e30 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
14e40 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
14e50 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
14e60 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
14e70 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
14e80 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
14e90 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
14ea0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
14eb0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
14ec0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
14ed0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
14ee0 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
14ef0 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
14f00 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
14f10 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
14f20 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
14f30 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
14f40 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
14f50 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
14f60 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
14f70 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
14f80 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
14f90 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
14fa0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
14fb0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
14fc0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
14fd0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
14fe0 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
14ff0 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
15000 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
15010 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
15020 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
15030 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
15040 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
15050 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
15060 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
15070 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
15080 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
15090 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
150a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
150b0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
150c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
150d0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
150e0 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
150f0 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
15100 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
15110 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
15120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15130 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
15140 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
15150 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15160 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
15170 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15180 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
15190 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
151a0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
151b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
151c0 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
151d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
151e0 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
151f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
15200 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
15210 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
15220 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
15230 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
15240 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
15250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15260 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
15270 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
15280 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
15290 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
152a0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
152b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
152c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
152d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
152e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
152f0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
15300 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
15310 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
15320 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
15330 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
15340 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15350 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
15360 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
15370 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15380 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
15390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
153a0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
153b0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
153c0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
153d0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
153e0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
153f0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
15400 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
15410 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
15420 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
15430 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
15440 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15450 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
15460 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
15470 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
15480 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
15490 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
154a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
154b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
154c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
154d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
154e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
154f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
15500 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
15510 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
15520 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
15530 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
15540 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
15550 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
15560 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
15570 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
15580 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
15590 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
155a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
155b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
155c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
155d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
155e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
155f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
15600 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
15610 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
15620 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15640 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
15650 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
15660 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15670 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15680 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
15690 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
156a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
156b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
156c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
156d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
156e0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
156f0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
15700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
15710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15720 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
15730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15740 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
15750 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
15760 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
15770 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
15780 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
15790 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
157a0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
157b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
157c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
157d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
157e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
157f0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
15800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15810 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15820 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
15830 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15840 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
15850 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
15860 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
15870 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
15880 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
15890 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
158a0 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
158b0 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
158c0 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
158d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
158e0 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
158f0 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
15900 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
15910 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
15920 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
15930 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
15940 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
15950 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
15960 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
15970 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15990 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
159a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
159b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
159c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
159d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
159e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
159f0 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
15a00 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15a10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15a20 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15a40 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15a50 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
15a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15a70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
15a80 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
15a90 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
15aa0 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
15ab0 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
15ac0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
15ad0 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
15ae0 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
15af0 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
15b00 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
15b10 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
15b20 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
15b30 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
15b40 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
15b50 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
15b60 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
15b70 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
15b80 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
15b90 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
15ba0 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
15bb0 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
15bc0 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
15bd0 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
15be0 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15bf0 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
15c00 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
15c10 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
15c20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15c30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c40 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
15c50 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
15c60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15c70 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15c80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15c90 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
15ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15cb0 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
15cc0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15ce0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15cf0 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
15d00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15d10 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
15d20 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
15d30 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
15d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
15d50 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
15d60 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
15d70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15d80 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
15d90 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
15da0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
15db0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15dc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15dd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15de0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15df0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15e00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15e10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
15e20 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
15e30 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
15e40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15e50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15e60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
15e80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
15e90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ea0 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
15eb0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
15ec0 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
15ed0 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
15ee0 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
15ef0 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
15f00 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
15f10 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
15f20 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
15f30 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
15f40 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
15f50 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
15f60 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
15f70 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
15f80 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
15f90 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
15fa0 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
15fb0 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
15fc0 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
15fd0 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
15fe0 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
15ff0 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
16000 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
16010 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
16020 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
16030 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
16040 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
16050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16060 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
16070 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16080 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
16090 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
160a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
160b0 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
160c0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
160d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
160e0 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
160f0 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
16100 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
16110 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16120 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16140 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
16150 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16160 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
16170 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
16180 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
16190 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
161a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
161b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
161c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
161d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
161e0 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
161f0 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
16200 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16210 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
16220 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
16230 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
16240 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
16250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
16260 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
16270 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
16280 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
16290 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
162a0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
162b0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
162c0 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
162d0 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
162e0 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
162f0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
16300 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
16310 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
16320 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
16330 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
16340 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
16350 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
16360 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
16370 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
16380 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
16390 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
163a0 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
163b0 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
163c0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
163d0 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
163e0 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
163f0 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
16400 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16410 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
16420 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
16430 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
16440 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
16450 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16460 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
16470 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
16480 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
16490 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
164a0 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
164b0 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
164c0 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
164d0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
164e0 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
164f0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
16500 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
16510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16520 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
16530 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
16540 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
16550 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
16560 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16570 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
16580 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16590 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
165a0 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
165b0 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
165c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
165d0 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
165e0 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
165f0 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
16600 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
16610 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
16620 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
16630 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
16640 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
16650 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
16660 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16670 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
16680 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
16690 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
166a0 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
166b0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
166c0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
166d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
166e0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
166f0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
16700 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
16710 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
16720 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
16730 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
16740 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
16750 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
16760 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
16770 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
16780 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
16790 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
167a0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
167b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
167c0 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
167d0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
167e0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
167f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16800 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
16810 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
16820 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
16830 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
16840 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
16850 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
16860 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
16870 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16880 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16890 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
168a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
168b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
168c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
168d0 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
168e0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
168f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16900 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16910 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
16920 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
16930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16940 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
16950 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
16960 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
16970 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
16980 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
16990 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
169a0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
169b0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
169c0 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
169d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
169e0 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
169f0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
16a00 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
16a10 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
16a20 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
16a30 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
16a40 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
16a50 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
16a60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
16a70 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
16a80 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
16a90 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
16aa0 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
16ab0 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
16ac0 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
16ad0 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
16ae0 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
16af0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16b00 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
16b10 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
16b20 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
16b30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b40 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
16b50 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
16b60 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
16b70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16b80 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
16b90 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
16ba0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
16bb0 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
16bc0 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
16bd0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
16be0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16bf0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
16c00 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
16c10 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
16c20 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
16c30 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
16c40 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
16c50 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
16c60 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
16c70 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
16c80 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
16c90 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
16ca0 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
16cb0 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
16cc0 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
16cd0 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
16ce0 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
16cf0 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
16d00 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
16d10 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
16d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16d30 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
16d40 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
16d50 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16d60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16d70 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
16d80 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
16d90 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
16da0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16db0 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
16dc0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16dd0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
16de0 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
16df0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
16e00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e10 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
16e20 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
16e30 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
16e40 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
16e50 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
16e60 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
16e70 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
16e80 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
16e90 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
16ea0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
16eb0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
16ec0 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
16ed0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
16ee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
16ef0 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
16f00 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
16f10 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
16f20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16f30 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
16f40 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
16f50 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
16f60 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
16f70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16f80 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
16f90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
16fa0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16fb0 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
16fc0 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
16fd0 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
16fe0 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
16ff0 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
17000 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
17010 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
17020 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
17030 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
17040 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
17050 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
17060 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
17070 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17080 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17090 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
170a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
170b0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
170c0 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
170d0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
170e0 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
170f0 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
17100 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
17110 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17120 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
17130 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
17140 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17150 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17160 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
17170 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17180 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
17190 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
171a0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
171b0 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
171c0 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
171d0 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
171e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
171f0 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
17200 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
17210 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
17220 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
17230 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
17240 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
17250 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
17260 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
17270 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
17280 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
17290 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
172a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
172b0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
172c0 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
172d0 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
172e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
172f0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
17300 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17310 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
17320 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17340 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
17350 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
17360 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17370 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
17380 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17390 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
173a0 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
173b0 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
173c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
173d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
173e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
173f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
17400 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
17410 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
17420 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
17430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17440 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17450 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
17460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17470 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
17480 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
17490 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
174a0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
174b0 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
174c0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
174d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
174e0 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
174f0 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
17500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17510 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
17520 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
17530 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
17540 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17550 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17560 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
17570 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
17580 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
17590 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
175a0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
175b0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
175c0 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
175d0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
175e0 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
175f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17600 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17610 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
17620 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
17630 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
17640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17650 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
17660 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
17670 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
17680 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
17690 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
176a0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
176b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
176c0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
176d0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
176e0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
176f0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
17700 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
17710 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17720 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17730 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
17740 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
17750 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
17760 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
17770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
17780 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
17790 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
177c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
177d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
177e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
177f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
17800 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
17810 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
17820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
17830 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
17840 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
17850 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
17860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17870 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17880 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17890 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
178a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
178b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
178c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
178d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
178e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
178f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17910 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
17920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17930 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
17940 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
17950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17960 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17970 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17980 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
17990 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
179a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
179b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
179c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
179d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
179e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
179f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
17a00 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
17a10 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
17a20 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
17a30 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
17a40 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17a50 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
17a60 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17a70 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
17a80 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
17a90 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
17aa0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
17ab0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
17ac0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
17ad0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
17ae0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
17af0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
17b00 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
17b10 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
17b20 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
17b30 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
17b40 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
17b50 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17b60 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17b70 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
17b80 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
17b90 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
17ba0 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
17bb0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
17bc0 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
17bd0 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
17be0 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
17bf0 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
17c00 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
17c10 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
17c20 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
17c30 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
17c40 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17c50 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17c60 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17c70 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
17c80 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
17c90 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
17ca0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
17cb0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
17cc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17cd0 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
17ce0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17cf0 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
17d00 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
17d10 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
17d20 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17d30 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
17d40 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
17d50 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
17d60 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17d70 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
17d80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
17d90 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
17da0 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
17db0 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
17dc0 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
17dd0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
17de0 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
17df0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
17e00 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
17e10 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
17e20 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
17e30 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
17e40 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
17e50 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
17e60 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
17e70 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
17e80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
17e90 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
17ea0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
17eb0 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
17ec0 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
17ed0 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
17ee0 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
17ef0 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
17f00 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
17f10 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
17f20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
17f30 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
17f40 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
17f50 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
17f60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
17f70 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
17f80 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
17f90 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
17fa0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
17fb0 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
17fc0 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
17fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17fe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
17ff0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18000 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18010 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  {.#if SQLITE_DEF
18020 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18030 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
18040 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
18050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18060 20 2a 64 62 3b 0a 20 20 20 20 20 20 20 20 44 62   *db;.        Db
18070 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 20 20 69   *pDb;.        i
18080 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18090 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
180a0 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
180b0 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
180c0 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
180d0 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
180e0 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  pDb++; }.       
180f0 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e     if( pDb->bSyn
18100 63 53 65 74 3d 3d 30 0a 20 20 20 20 20 20 20 20  cSet==0.        
18110 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
18120 79 5f 6c 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f  y_level==SQLITE_
18130 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18140 4f 55 53 2b 31 0a 20 20 20 20 20 20 20 20 20 20  OUS+1.          
18150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
18160 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18170 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18180 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
18190 53 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S+1;.           
181a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
181b0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
181c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
181d0 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
181e0 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
181f0 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18200 41 53 4b 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ASK));.         
18210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
18220 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
18230 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
18240 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18250 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18260 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18270 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18280 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
182a0 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
182b0 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
182c0 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
182d0 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
182e0 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
182f0 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
18300 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
18310 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
18320 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
18330 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
18340 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
18350 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
18360 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
18370 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18380 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18390 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
183a0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
183b0 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
183c0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
183d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
183e0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
183f0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
18400 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18410 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18420 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
18430 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
18440 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
18450 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
18460 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
18470 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18480 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
18490 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
184a0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
184b0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
184c0 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
184d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
184e0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
184f0 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
18500 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
18510 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
18520 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18530 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
18540 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
18550 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
18560 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
18570 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
18580 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
18590 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
185a0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
185b0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
185c0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
185d0 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
185e0 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
185f0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
18600 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18610 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
18620 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
18630 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
18640 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18650 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
18660 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
18670 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
18680 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
18690 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
186a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
186b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
186c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
186d0 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
186e0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
186f0 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
18700 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
18710 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
18720 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
18730 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
18740 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
18750 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
18760 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
18770 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
18780 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
18790 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
187a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
187b0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
187c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
187d0 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
187e0 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
187f0 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
18800 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
18810 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
18820 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
18830 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18840 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
18850 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
18860 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
18870 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
18880 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
18890 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
188a0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
188b0 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
188c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
188d0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
188e0 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
188f0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
18900 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
18910 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
18920 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
18930 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
18940 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
18950 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
18960 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18970 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18980 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18990 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
189a0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
189b0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
189c0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
189d0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
189e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
189f0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
18a00 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
18a10 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
18a40 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
18a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18a70 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
18a80 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
18a90 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
18aa0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
18ab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ac0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18ad0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18ae0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18af0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18b00 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
18b10 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
18b20 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
18b30 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
18b40 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
18b50 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
18b60 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
18b70 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
18b80 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
18b90 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
18ba0 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
18bb0 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
18bc0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
18bd0 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
18be0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18bf0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
18c00 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
18c10 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
18c20 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18c30 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
18c40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18c50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
18c60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
18c70 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18c80 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
18c90 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
18ca0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18cb0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
18cc0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
18cd0 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
18ce0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
18cf0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
18d00 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
18d10 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
18d20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
18d30 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
18d40 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
18d50 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
18d60 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
18d70 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
18d80 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
18d90 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
18da0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
18db0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
18dc0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
18dd0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
18de0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
18df0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
18e00 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
18e10 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
18e20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
18e30 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18e40 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
18e50 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
18e60 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
18e70 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
18e80 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
18e90 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
18ea0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
18eb0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
18ec0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
18ed0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
18ee0 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
18ef0 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
18f00 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
18f10 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
18f20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
18f30 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
18f40 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18f50 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
18f60 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
18f70 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
18f80 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
18f90 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
18fa0 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
18fb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18fc0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
18fd0 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
18fe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
18ff0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19000 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
19010 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
19020 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19030 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
19040 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
19050 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
19060 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
19070 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
19080 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
19090 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
190a0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
190b0 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
190c0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
190d0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
190e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
190f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
19100 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19110 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
19120 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
19130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
19140 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
19150 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19160 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
19170 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
19180 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
19190 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
191a0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
191b0 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
191c0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
191d0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
191e0 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
191f0 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
19200 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
19210 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
19220 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
19230 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
19240 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
19250 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
19260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
19270 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
19280 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
19290 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
192a0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
192b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
192c0 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
192d0 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
192e0 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
192f0 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
19300 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
19310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
19320 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
19330 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
19340 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
19350 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
19360 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
19370 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
19380 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
19390 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
193a0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
193b0 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
193c0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
193d0 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
193e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
193f0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
19400 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
19410 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
19420 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
19430 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
19440 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
19450 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
19460 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
19470 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
19480 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
19490 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
194a0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
194b0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
194c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194e0 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
194f0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
19500 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
19510 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
19520 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
19530 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
19540 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
19550 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
19560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
19570 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19580 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
195a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
195b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
195c0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
195d0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
195e0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
195f0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
19600 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
19610 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19620 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
19630 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
19640 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
19650 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
19660 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
19670 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
19680 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19690 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
196a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
196b0 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
196c0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
196d0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
196e0 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
196f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
19700 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
19710 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
19720 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
19730 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
19740 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
19750 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
19760 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19770 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19790 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
197a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
197b0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
197c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
197d0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
197e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
197f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
19810 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
19820 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19830 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
19840 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
19850 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
19860 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
19870 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
19880 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19890 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
198a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
198b0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
198c0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
198d0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
198e0 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
198f0 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
19900 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
19910 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
19920 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19930 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
19940 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
19950 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
19960 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
19970 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
19980 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
19990 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
199a0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
199b0 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
199c0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
199d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
199e0 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
199f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
19a00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
19a10 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
19a20 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
19a30 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
19a40 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
19a50 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
19a60 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
19a70 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
19a80 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
19a90 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
19aa0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
19ab0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
19ac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ad0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
19ae0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
19af0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
19b00 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
19b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19b20 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
19b30 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
19b40 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
19b50 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
19b60 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
19b70 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
19b80 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
19b90 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
19ba0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
19bb0 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
19bc0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
19bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
19bf0 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
19c00 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19c10 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
19c20 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
19c30 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
19c40 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
19c50 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
19c60 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
19c70 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
19c80 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
19c90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19ca0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
19cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
19cc0 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
19cd0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19ce0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19cf0 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
19d00 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
19d10 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
19d20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19d30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19d50 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
19d60 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19d70 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
19d80 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
19d90 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
19da0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19db0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
19dc0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
19dd0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
19de0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19df0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
19e00 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
19e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19e20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
19e30 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
19e40 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
19e50 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
19e60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
19e70 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
19e80 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
19e90 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
19ea0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
19eb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
19ec0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
19ed0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
19ee0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
19ef0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
19f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19f10 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
19f20 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
19f30 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
19f40 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
19f50 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
19f60 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
19f70 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19f80 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
19f90 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
19fa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
19fb0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
19fc0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
19fd0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
19fe0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19ff0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1a000 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1a010 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1a020 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a030 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1a040 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a050 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1a060 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1a070 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1a080 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a090 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1a0a0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1a0b0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1a0c0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1a0d0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1a0e0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1a0f0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1a100 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1a110 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1a120 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1a130 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1a140 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1a150 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1a160 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1a170 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1a180 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1a190 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1a1a0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1a1b0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1a1c0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1a1d0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1a1e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1a1f0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1a200 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1a210 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1a220 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1a230 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1a240 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1a250 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1a260 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1a270 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1a280 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1a290 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1a2a0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1a2b0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1a2c0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1a2d0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1a2e0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1a2f0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1a300 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1a310 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1a320 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1a330 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1a340 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1a350 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1a360 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1a370 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1a380 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1a390 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1a3a0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1a3b0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1a3c0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1a3d0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1a3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a3f0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1a400 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1a410 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
1a420 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a430 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a440 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1a450 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1a460 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1a470 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1a480 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1a490 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1a4a0 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1a4b0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1a4c0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a4d0 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1a4e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1a4f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1a500 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1a510 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1a520 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a530 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1a540 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1a550 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1a560 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a570 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a580 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a590 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a5a0 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1a5b0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1a5c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1a5d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1a5e0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1a5f0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1a600 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1a610 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a620 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a630 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1a640 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a650 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a660 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a670 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1a680 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a690 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1a6a0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1a6b0 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1a6c0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1a6d0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1a6e0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1a6f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1a700 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1a710 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1a720 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1a730 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1a740 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1a750 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1a760 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1a770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1a780 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1a790 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a7a0 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1a7b0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1a7c0 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1a7d0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1a7e0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1a7f0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1a800 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1a810 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1a820 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1a830 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1a840 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1a850 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1a860 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a870 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1a880 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1a890 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1a8a0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1a8b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a8c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a8d0 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1a8e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a8f0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1a900 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1a910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1a920 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1a930 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1a940 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a950 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a960 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1a970 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1a980 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1a990 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1a9a0 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1a9b0 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1a9c0 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1a9d0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1a9e0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1a9f0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1aa00 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1aa10 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1aa20 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1aa30 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1aa40 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1aa50 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1aa60 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1aa70 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1aa80 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1aa90 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1aaa0 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1aab0 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1aac0 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1aad0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1aae0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1aaf0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1ab00 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1ab10 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1ab20 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1ab30 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1ab40 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1ab50 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ab60 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1ab70 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ab80 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ab90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1aba0 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1abb0 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1abc0 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1abd0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1abe0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1abf0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1ac00 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ac10 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1ac20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1ac30 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1ac40 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1ac50 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1ac60 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1ac70 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1ac80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1ac90 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1aca0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1acb0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1acc0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1acd0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1ace0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1acf0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1ad00 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1ad10 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1ad20 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1ad30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1ad40 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1ad50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1ad60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1ad70 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1ad80 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1ad90 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1ada0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1adb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1add0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1ade0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1adf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1ae00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ae10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1ae20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1ae30 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1ae40 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1ae50 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1ae60 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1ae70 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1ae80 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1ae90 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1aea0 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
1aeb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aec0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1aed0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1aee0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1aef0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1af00 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1af10 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1af20 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1af30 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1af40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1af50 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1af60 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1af70 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1af80 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1af90 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1afa0 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1afb0 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1afc0 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1afd0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1afe0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1aff0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1b000 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1b010 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1b020 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1b030 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1b040 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1b050 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b060 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1b070 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1b080 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1b090 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b0a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b0b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b0c0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1b0d0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1b0e0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1b0f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1b100 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1b110 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b120 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1b130 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1b140 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1b150 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1b160 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1b170 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1b180 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1b190 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1b1a0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1b1b0 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1b1c0 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1b1d0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1b1e0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1b1f0 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1b200 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1b210 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1b220 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1b230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b240 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1b250 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1b260 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1b270 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1b280 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1b290 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1b2a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1b2b0 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1b2c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b2d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1b2e0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1b2f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b300 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1b310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b320 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1b330 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b360 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1b370 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1b380 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1b390 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b3a0 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
1b3b0 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
1b3c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1b3d0 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
1b3e0 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1b3f0 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1b400 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1b410 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1b420 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1b430 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1b440 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1b450 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1b460 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
1b470 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1b480 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1b490 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1b4a0 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
1b4b0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b4c0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b4d0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b4e0 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
1b4f0 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
1b500 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b520 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b530 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b550 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1b560 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1b570 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1b580 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1b590 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1b5a0 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1b5b0 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1b5c0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1b5d0 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1b5e0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1b5f0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1b600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1b610 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1b620 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1b630 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1b640 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b670 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1b680 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b6b0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1b6c0 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1b6d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b700 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1b710 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1b720 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
1b730 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1b740 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1b750 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1b760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b770 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1b780 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1b790 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
1b7a0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1b7b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b7c0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
1b7d0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
1b7e0 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
1b7f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b800 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1b810 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1b820 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1b830 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1b840 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1b850 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1b860 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1b870 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1b880 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1b890 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1b8a0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1b8b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1b8c0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1b8d0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1b8e0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1b8f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1b900 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1b910 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1b920 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b930 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b940 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1b950 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b960 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b970 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b980 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
1b990 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
1b9a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1b9b0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
1b9c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b9d0 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1b9e0 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1b9f0 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1ba00 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1ba10 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1ba20 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1ba30 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1ba40 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1ba50 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1ba60 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1ba70 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1ba80 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1ba90 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1baa0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1bab0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bac0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1baf0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bb00 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1bb10 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1bb20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bb30 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1bb40 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1bb50 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1bb60 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1bb70 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1bb80 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1bb90 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1bba0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1bbb0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1bbc0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1bbd0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1bbf0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1bc00 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1bc10 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1bc20 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1bc30 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1bc40 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1bc50 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1bc60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1bc70 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1bc80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1bc90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1bca0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1bcb0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1bcc0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1bcd0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1bce0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1bcf0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1bd00 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1bd10 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1bd20 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1bd30 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1bd40 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1bd50 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1bd60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1bd70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1bd80 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1bd90 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
1bda0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
1bdb0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1bdc0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
1bdd0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1bde0 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1bdf0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
1be00 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1be10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1be20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1be30 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1be40 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1be50 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1be60 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1be70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1be80 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1be90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1bea0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1beb0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1bec0 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1bed0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1bee0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1bef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1bf00 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1bf10 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20 20  nPayload.       
1bf20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1bf30 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e  nSize-1<=pPage->
1bf40 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
1bf50 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
1bf60 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
1bf70 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1bf80 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29 7b  ze-4).        ){
1bf90 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1bfa0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1bfb0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1bfc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bfe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1bff0 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1c000 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1c010 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1c020 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1c030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c050 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c060 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1c070 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1c080 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1c090 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1c0a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c0b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c0c0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1c0d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c0e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c100 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1c110 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c120 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1c130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1c140 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1c150 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
1c160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c170 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1c180 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1c190 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1c1a0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1c1b0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1c1c0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1c1d0 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1c1e0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1c1f0 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1c200 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1c210 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1c220 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1c230 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1c240 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1c250 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1c260 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1c270 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1c280 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1c290 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1c2a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1c2b0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1c2c0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1c2d0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1c2e0 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1c2f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1c310 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1c320 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1c330 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1c340 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1c350 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1c360 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c370 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1c380 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c390 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1c3b0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1c3c0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1c3d0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c3e0 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1c3f0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1c400 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1c410 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1c420 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1c430 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1c440 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1c450 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c460 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1c470 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1c480 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1c490 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1c4a0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1c4b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1c4c0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1c4d0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1c4e0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1c4f0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1c500 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1c510 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1c520 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c530 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1c540 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1c550 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c560 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c570 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1c580 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c590 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1c5b0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1c5c0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1c5d0 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1c5e0 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1c5f0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1c600 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1c610 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1c620 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1c630 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1c640 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1c650 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1c660 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1c670 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1c680 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1c690 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1c6a0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1c6b0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1c6c0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1c6d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c6f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1c700 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1c710 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1c720 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1c730 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1c740 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1c750 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1c760 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1c770 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1c780 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1c790 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1c7a0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1c7b0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1c7c0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1c7d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1c7e0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1c7f0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1c800 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1c810 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1c820 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1c830 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1c840 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1c850 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1c860 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1c870 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1c880 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1c890 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1c8a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1c8b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1c8c0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1c8d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1c8e0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1c8f0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1c900 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1c910 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c920 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1c930 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1c940 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1c950 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1c960 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1c970 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1c980 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1c990 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1c9a0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1c9b0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1c9c0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1c9d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c9e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1c9f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ca00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1ca10 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1ca20 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1ca30 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1ca40 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1ca50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1ca60 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1ca70 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1ca80 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1ca90 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1caa0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1cab0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1cac0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1cad0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cae0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1caf0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1cb00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1cb10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cb30 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1cb40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1cb50 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1cb60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1cb90 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1cba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cbb0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1cbc0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1cbd0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1cbe0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1cbf0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1cc00 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1cc10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cc20 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1cc30 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1cc40 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1cc50 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1cc60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1cc70 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1cc80 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1cc90 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1cca0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1ccb0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1ccc0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1ccd0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1cce0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1ccf0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1cd00 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1cd10 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1cd20 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1cd30 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1cd40 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1cd50 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1cd60 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1cd70 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1cd80 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1cd90 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1cda0 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1cdb0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1cdc0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1cdd0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1cde0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1cdf0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1ce00 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1ce10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1ce20 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1ce30 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1ce40 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1ce50 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1ce60 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1ce70 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1ce80 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1ce90 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1cea0 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1ceb0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1cec0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1ced0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1cee0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1cef0 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1cf00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cf10 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1cf20 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1cf30 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1cf40 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1cf50 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1cf60 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1cf70 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1cf80 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1cf90 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1cfa0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1cfb0 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1cfc0 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1cfd0 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1cfe0 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1cff0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1d000 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1d010 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d020 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1d030 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1d040 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1d050 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1d060 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1d070 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1d080 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1d090 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d0a0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1d0b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1d0c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1d0d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d0e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d0f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d100 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1d110 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1d120 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1d130 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1d140 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d150 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1d160 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1d170 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1d180 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1d190 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d1a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d1b0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1d1c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1d1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1d1e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1d1f0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d200 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1d210 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1d220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1d240 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d250 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d260 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d280 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d2a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1d2b0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1d2c0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1d2d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1d2e0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1d2f0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1d300 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1d310 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1d320 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1d330 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1d340 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1d350 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1d360 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1d370 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1d380 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1d390 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1d3a0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1d3b0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1d3c0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1d3d0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1d3e0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1d3f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1d400 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1d410 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1d420 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1d430 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1d440 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1d450 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1d460 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1d470 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1d480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d4a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d4b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1d4c0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1d4d0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1d4e0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1d4f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d500 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1d510 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1d520 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d530 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1d540 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1d550 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1d560 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1d570 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1d580 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1d590 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1d5a0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d5b0 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1d5c0 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1d5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1d5e0 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1d5f0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d600 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1d610 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1d620 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1d630 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1d640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d670 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1d680 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1d690 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1d6a0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1d6b0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1d6c0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1d6d0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1d6e0 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1d6f0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1d700 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1d710 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1d720 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1d730 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1d740 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1d750 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1d760 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1d770 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1d780 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1d790 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1d7a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1d7b0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1d7c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1d7d0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1d7e0 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1d7f0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1d800 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1d810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1d820 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1d830 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1d840 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1d850 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1d860 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1d870 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1d880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d8a0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1d8b0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d8c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d8d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d8e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d8f0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1d900 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1d910 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1d920 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1d930 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1d940 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1d950 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1d960 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1d970 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1d980 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1d990 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1d9a0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1d9b0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1d9c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d9d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d9f0 20 20 7d 0a 0a 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 64 6f 20  it==0 ){.    do 
1da10 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1da20 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1da30 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1da40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1da50 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1da60 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1da70 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1da80 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1da90 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1daa0 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1dab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dac0 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1dad0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1dae0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1daf0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1db00 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1db10 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1db20 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1db30 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1db40 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1db50 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1db60 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1db70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1db80 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1db90 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1dba0 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1dbb0 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1dbc0 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1dbd0 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1dbe0 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc00 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1dc10 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1dc20 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1dc30 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1dc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dc50 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1dc60 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1dc70 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1dca0 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1dcb0 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1dcc0 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1dcd0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1dce0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1dcf0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1dd00 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1dd10 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1dd20 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1dd30 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1dd40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dd50 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1dd60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dd70 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1dd80 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1dd90 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1dda0 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1ddb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ddc0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1ddd0 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1dde0 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1ddf0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1de00 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1de10 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1de20 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1de30 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1de40 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1de50 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1de60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1de70 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1de80 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1de90 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1dea0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1deb0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1dec0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1ded0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1dee0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1def0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1df00 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1df10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1df20 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1df30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1df40 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1df50 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1df60 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1df70 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1df80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1df90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dfa0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1dfb0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1dfc0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1dfd0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1dfe0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1dff0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1e000 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e010 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1e020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1e030 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1e040 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e050 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1e060 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e070 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e080 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1e090 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e0a0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e0b0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1e0c0 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1e0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1e0e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e0f0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1e100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e110 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1e120 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1e130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1e150 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e160 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1e170 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1e180 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1e190 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1e1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e1c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e1d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e1e0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e1f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e200 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e210 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1e220 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1e230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e240 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1e250 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1e260 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1e270 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e2a0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1e2b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1e2c0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1e2d0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1e2e0 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1e2f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e300 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1e310 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e320 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1e330 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1e340 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e350 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1e360 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1e370 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1e380 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1e390 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1e3a0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1e3b0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1e3c0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1e3d0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1e3e0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1e3f0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1e400 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1e410 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1e420 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1e430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e440 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e450 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1e460 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1e470 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1e480 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e490 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1e4a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e4b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e4c0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1e4d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1e4e0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1e4f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1e500 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1e510 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1e520 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1e530 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e540 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1e550 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1e560 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1e570 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1e580 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e590 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1e5a0 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1e5b0 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1e5c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1e5d0 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1e5e0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1e5f0 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1e600 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1e610 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1e620 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1e630 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e640 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1e650 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1e660 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1e670 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e680 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1e690 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1e6a0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1e6b0 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1e6c0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1e6d0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1e6e0 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1e6f0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1e700 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1e710 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1e720 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1e730 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1e740 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e750 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1e760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e780 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1e790 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e7a0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e7b0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1e7c0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1e7d0 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1e7e0 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1e7f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e800 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1e810 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1e820 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1e830 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1e840 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1e850 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1e860 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1e870 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1e880 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1e890 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1e8a0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1e8b0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1e8c0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1e8d0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1e8e0 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1e8f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e900 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e910 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e920 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1e930 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1e940 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e950 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1e960 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e970 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1e980 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e990 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e9a0 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1e9b0 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1e9c0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1e9d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1e9e0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1e9f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ea00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ea10 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1ea20 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ea30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1ea40 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1ea50 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1ea60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ea70 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1ea80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ea90 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1eaa0 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1eab0 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1eac0 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1ead0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1eae0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1eaf0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1eb00 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1eb10 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1eb20 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1eb30 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1eb40 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1eb50 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1eb60 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1eb70 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1eb80 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1eb90 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1eba0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1ebb0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1ebc0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1ebd0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1ebe0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1ebf0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1ec00 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1ec10 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1ec20 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1ec30 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1ec40 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1ec50 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1ec60 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1ec70 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1ec80 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1ec90 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1eca0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1ecb0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1ecc0 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1ecd0 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1ece0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ecf0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1ed00 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1ed10 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1ed20 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1ed30 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1ed40 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1ed50 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1ed60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1ed70 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1ed80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1ed90 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1eda0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1edb0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1edc0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1edd0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1ede0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1edf0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1ee00 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1ee10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ee20 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1ee30 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1ee40 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1ee50 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1ee60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1ee70 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1ee80 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1ee90 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1eea0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1eeb0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1eec0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1eed0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1eee0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1eef0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1ef00 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1ef10 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1ef20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1ef30 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1ef40 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1ef50 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1ef60 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1ef70 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1ef80 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1ef90 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1efa0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1efb0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1efc0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1efd0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1efe0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1eff0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1f000 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1f010 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1f020 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f030 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1f040 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1f050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1f060 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f070 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1f080 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f090 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f0a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f0b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1f0c0 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1f0d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f0e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f0f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1f110 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1f120 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1f130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1f150 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1f160 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f180 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1f190 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1f1a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1f1b0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1f1c0 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1f1d0 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1f1e0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1f1f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f200 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1f210 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1f220 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f230 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1f240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f250 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f260 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1f270 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1f280 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1f290 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1f2a0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1f2b0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1f2c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1f2d0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1f2e0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1f2f0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1f300 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f310 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f320 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1f330 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1f340 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1f350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f360 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1f370 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f380 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1f390 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1f3a0 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1f3b0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1f3c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1f3d0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1f3e0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1f3f0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1f400 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1f410 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1f420 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1f430 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1f440 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1f450 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1f460 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1f470 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1f480 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1f490 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1f4a0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f4b0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f4c0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1f4d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1f4e0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1f4f0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1f500 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1f510 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1f520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f530 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1f540 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1f550 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1f560 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1f570 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1f580 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1f590 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1f5a0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f5b0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1f5c0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1f5d0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1f5e0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1f5f0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1f600 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1f610 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1f620 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1f630 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1f640 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1f650 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1f660 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1f670 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1f680 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f6a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1f6b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1f6c0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1f6d0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1f6e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1f6f0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1f700 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1f710 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1f720 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1f730 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f740 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1f750 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1f760 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1f770 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1f780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1f790 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f7a0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1f7b0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1f7c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1f7d0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1f7e0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1f7f0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1f800 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1f810 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1f820 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1f830 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1f840 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1f850 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1f860 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1f870 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1f880 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f890 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1f8a0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1f8b0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1f8c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1f8d0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1f8e0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1f8f0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1f900 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1f910 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1f920 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1f930 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1f940 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1f950 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1f960 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1f970 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1f980 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1f990 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1f9a0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1f9b0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1f9c0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1f9d0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1f9e0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1f9f0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1fa00 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1fa10 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1fa20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1fa30 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1fa40 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1fa50 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1fa60 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1fa70 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1fa80 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1fa90 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1faa0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1fab0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1fac0 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1fad0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1fae0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1faf0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1fb00 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1fb10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1fb20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fb30 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1fb40 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1fb50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fb60 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1fb70 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1fb80 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1fb90 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1fba0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1fbb0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1fbc0 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1fbd0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1fbe0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1fbf0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1fc00 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1fc10 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1fc20 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1fc30 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1fc40 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1fc50 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1fc60 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1fc70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1fc80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1fc90 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1fca0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1fcb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1fcc0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1fcd0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1fce0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1fcf0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1fd00 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1fd10 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1fd20 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1fd30 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1fd40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1fd50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1fd60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fd70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1fd80 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1fd90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1fda0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1fdb0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1fdc0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1fdd0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1fde0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1fdf0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1fe00 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1fe10 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1fe20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1fe30 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1fe40 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1fe50 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1fe60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1fe70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fe80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1fe90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1fea0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1feb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1fec0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1fed0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1fee0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1fef0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ff00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1ff10 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1ff20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ff30 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1ff40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ff50 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
1ff60 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
1ff70 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
1ff80 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
1ff90 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
1ffa0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1ffb0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
1ffc0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
1ffd0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
1ffe0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1fff0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20000 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20020 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
20030 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
20040 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
20050 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20060 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
20070 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
20080 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
200a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
200b0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
200c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
200d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
200e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
200f0 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
20100 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20110 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
20120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20130 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
20140 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
20150 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
20160 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
20170 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
20180 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
20190 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
201a0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
201b0 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
201c0 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
201d0 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
201e0 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
201f0 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
20200 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
20210 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
20220 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
20230 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
20240 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
20250 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
20260 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
20270 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
20280 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
20290 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
202a0 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
202b0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
202c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
202d0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
202e0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
202f0 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
20300 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
20310 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
20320 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
20330 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
20340 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
20350 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
20360 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
20370 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
20380 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
20390 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
203a0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
203b0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
203c0 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
203d0 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
203e0 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
203f0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20400 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
20410 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
20420 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
20430 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
20440 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
20450 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
20460 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
20470 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
20480 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
20490 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
204a0 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
204b0 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
204c0 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
204d0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
204e0 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
204f0 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
20500 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
20510 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
20520 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
20530 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
20540 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
20550 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
20560 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
20570 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
20580 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
20590 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
205a0 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
205b0 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
205c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
205d0 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
205e0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
205f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
20600 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
20610 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
20620 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
20630 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
20640 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
20650 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
20660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20670 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20680 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
20690 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
206a0 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
206b0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
206c0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
206d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
206e0 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
206f0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
20700 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
20710 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
20720 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
20730 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
20740 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
20750 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
20760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
20770 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20780 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
20790 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
207a0 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
207b0 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
207c0 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
207d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
207e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
207f0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
20800 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20810 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
20820 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
20830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20870 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
20880 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
20890 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
208a0 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
208b0 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
208c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
208d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
208e0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
208f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20900 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
20910 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
20920 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
20930 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
20940 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
20950 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
20960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20970 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
20980 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
20990 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
209a0 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
209b0 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
209c0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
209d0 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
209e0 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
209f0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
20a00 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20a10 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
20a20 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
20a30 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
20a40 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
20a50 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
20a60 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
20a70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
20a80 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
20a90 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
20aa0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
20ab0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
20ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20ad0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
20ae0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
20af0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
20b00 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
20b10 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
20b20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
20b30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
20b40 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
20b50 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
20b60 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
20b70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
20b80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
20b90 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
20ba0 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
20bb0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
20bc0 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
20bd0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
20be0 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
20bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20c10 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
20c20 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20c30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
20c40 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
20c50 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20c60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20c70 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
20c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20ca0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
20cb0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
20cc0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20cd0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
20ce0 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
20cf0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
20d10 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
20d20 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
20d30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
20d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
20d50 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
20d60 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20d70 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20d80 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20d90 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
20da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
20db0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
20dc0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
20dd0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
20de0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
20df0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
20e00 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
20e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
20e20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
20e30 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
20e40 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
20e50 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
20e60 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
20e70 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
20e80 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
20e90 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
20ea0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
20eb0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
20ec0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
20ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
20ee0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
20ef0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
20f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20f10 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
20f20 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
20f30 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
20f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
20f50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
20f60 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
20f70 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
20f80 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
20f90 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
20fa0 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
20fb0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
20fc0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20fd0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
20fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
20ff0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
21000 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
21010 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
21020 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
21030 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
21040 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
21050 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
21060 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
21070 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
21080 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
21090 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
210a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
210b0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
210c0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
210d0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
210e0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
210f0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
21100 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
21110 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
21120 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
21130 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
21140 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
21150 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
21160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
21170 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
21180 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
21190 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
211a0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
211b0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
211c0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
211d0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
211e0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
211f0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
21200 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
21210 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
21220 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
21230 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
21240 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
21250 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
21260 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
21270 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
21280 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
21290 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
212a0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
212b0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
212c0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
212d0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
212e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
212f0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
21300 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
21310 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
21320 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21330 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
21340 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
21350 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
21360 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
21370 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
21380 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
21390 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
213a0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
213b0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
213c0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
213d0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
213e0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
213f0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
21400 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
21410 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
21420 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
21430 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
21440 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
21450 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
21460 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
21470 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21480 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
21490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
214a0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
214b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
214c0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
214d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
214e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
214f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21500 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
21510 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
21520 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
21530 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
21540 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
21550 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
21560 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
21570 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
21580 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
21590 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
215a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
215b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
215c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
215d0 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
215e0 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
215f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21600 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
21610 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
21620 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
21630 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
21640 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
21650 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
21660 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
21670 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
21680 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
21690 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
216a0 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
216b0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
216c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
216d0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
216e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
216f0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
21700 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
21710 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
21720 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21730 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21750 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21760 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
21770 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
21780 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
21790 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
217a0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
217b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
217c0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
217d0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
217e0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
217f0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
21800 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
21810 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
21820 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
21830 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
21840 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
21850 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21860 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
21870 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
21880 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
21890 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
218a0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
218b0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
218c0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
218d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
218e0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
218f0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
21900 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
21910 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
21920 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
21930 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
21940 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
21950 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
21960 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
21970 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
21980 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21990 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
219a0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
219b0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
219c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
219d0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
219e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
219f0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
21a00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
21a20 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
21a30 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
21a40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
21a50 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
21a60 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
21a70 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
21a80 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
21a90 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
21aa0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21ab0 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
21ac0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
21ad0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21ae0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
21af0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21b10 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
21b20 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
21b30 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
21b40 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
21b50 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
21b60 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
21b70 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
21b80 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
21b90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
21ba0 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
21bb0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21bc0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
21bd0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21be0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
21bf0 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
21c00 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
21c10 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
21c20 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
21c30 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
21c40 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
21c50 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
21c60 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
21c70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
21c80 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
21c90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21cd0 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
21ce0 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
21cf0 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
21d00 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
21d10 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
21d20 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
21d30 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
21d40 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
21d50 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
21d60 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
21d70 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
21d80 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
21d90 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
21da0 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
21db0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
21dc0 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
21dd0 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
21de0 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
21df0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
21e00 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
21e10 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
21e20 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20  it of wrFlag is 
21e30 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
21e40 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a  cursor can only.
21e50 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ** be used for r
21e60 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20  eading.  If the 
21e70 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
21e80 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
21e90 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62   cursor.** can b
21ea0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21eb0 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ng or for writin
21ec0 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
21ed0 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
21ee0 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65  g.** are also me
21ef0 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68  t.  These are th
21f00 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
21f10 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
21f20 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72   order.** for wr
21f30 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f  iting to be allo
21f40 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
21f50 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
21f60 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
21f70 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74  with wrFlag cont
21f80 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43  aining BTREE_WRC
21f90 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  SR.**.** 2:  Oth
21fa0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21fb0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
21fc0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
21fd0 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
21fe0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
21ff0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
22000 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
22010 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
22020 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
22030 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
22040 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
22050 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
22060 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
22070 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
22080 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
22090 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
220a0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
220b0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
220c0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
220d0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
220e0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
220f0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
22100 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
22110 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
22120 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
22130 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
22140 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
22150 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  e BTREE_FORDELET
22160 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  E bit of wrFlag 
22170 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  may optionally b
22180 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57  e set if BTREE_W
22190 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20  RCSR.** is set. 
221a0 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73   If FORDELETE is
221b0 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
221c0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
221d0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
221e0 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  ** this cursor w
221f0 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
22200 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20   to seek to and 
22210 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f  delete entries o
22220 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73  f an index.** as
22230 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
22240 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
22250 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45  nt.  The FORDELE
22260 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  TE hint is not u
22270 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69  sed by.** this i
22280 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
22290 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65  But in a hypothe
222a0 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76  tical alternativ
222b0 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
222c0 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e   .** in which in
222d0 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
222e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
222f0 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65  leted when corre
22300 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a  sponding table.*
22310 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  * rows are delet
22320 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54  ed, the FORDELET
22330 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74  E flag is a hint
22340 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61   that all SEEK a
22350 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65  nd DELETE.** ope
22360 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20  rations on this 
22370 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f  cursor can be no
22380 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41  -ops and all REA
22390 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e  D operations can
223a0 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75   .** return a nu
223b0 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a  ll row (2-bytes:
223c0 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a   0x01 0x00)..**.
223d0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
223e0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
223f0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
22400 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
22410 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
22420 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
22430 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
22440 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
22450 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
22460 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
22470 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
22480 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
22490 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
224a0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
224b0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
224c0 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
224d0 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
224e0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
224f0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
22500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
22510 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22520 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
22550 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
22560 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22580 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22590 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
225a0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
225d0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
225e0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
225f0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22610 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
22620 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
22630 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
22640 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22660 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
22670 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
22680 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22690 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
226a0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
226b0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
226c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
226f0 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
22700 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
22710 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22720 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
22730 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
22740 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20   wrFlag==0 .    
22750 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54     || wrFlag==BT
22760 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20  REE_WRCSR .     
22770 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54    || wrFlag==(BT
22780 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f  REE_WRCSR|BTREE_
22790 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b  FORDELETE) .  );
227a0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
227b0 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
227c0 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
227d0 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
227e0 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
227f0 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
22800 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
22810 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
22820 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
22830 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
22840 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
22850 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
22860 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
22870 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
22880 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
22890 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
228a0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
228b0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
228c0 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77   pKeyInfo!=0, (w
228d0 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20  rFlag?2:1)) );. 
228e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
228f0 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
22900 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
22910 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
22920 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
22930 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
22940 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
22950 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
22960 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
22970 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
22980 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22990 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
229a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
229b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
229c0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
229d0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
229e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
229f0 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
22a00 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
22a10 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
22a20 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
22a30 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
22a40 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
22a50 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
22a60 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22a70 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
22a80 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
22a90 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
22aa0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
22ab0 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
22ac0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
22ad0 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
22ae0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
22af0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
22b00 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
22b10 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
22b20 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
22b30 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
22b40 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
22b50 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
22b60 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
22b70 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
22b80 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
22b90 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
22ba0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
22bb0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
22bc0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
22bd0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
22be0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
22bf0 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57   wrFlag ? BTCF_W
22c00 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20  riteFlag : 0;.  
22c10 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
22c20 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
22c30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
22c40 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
22c50 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
22c60 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
22c70 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
22c80 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
22c90 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
22ca0 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
22cb0 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
22cc0 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
22cd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
22ce0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
22cf0 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
22d00 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
22d10 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
22d20 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22d30 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
22d40 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22d50 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
22d70 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
22d80 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
22d90 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
22da0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
22db0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22dc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22dd0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
22de0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
22df0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e20 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
22e30 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22e60 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
22e70 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
22e80 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
22eb0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
22ec0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
22ed0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
22ee0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
22ef0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22f00 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
22f10 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
22f20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
22f50 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
22f60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
22f70 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
22f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
22fa0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
22fb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
22fc0 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
22fd0 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
22fe0 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
22ff0 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
23000 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23030 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
23040 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23050 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
23060 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
23070 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
23080 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
23090 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
230a0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
230b0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
230c0 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
230d0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
230e0 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
230f0 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
23100 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
23110 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
23120 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
23130 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
23140 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23150 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
23160 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
23170 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
23180 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
23190 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
231a0 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
231b0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
231c0 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
231d0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
231e0 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
231f0 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
23200 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
23210 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
23220 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
23230 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
23240 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
23250 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
23260 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
23270 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
23280 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
23290 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
232a0 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
232b0 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
232c0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
232d0 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
232e0 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
232f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
23300 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
23310 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
23320 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
23330 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
23340 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
23350 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
23360 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
23370 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
23380 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
23390 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
233a0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
233b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
233c0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
233d0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
233e0 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
233f0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
23400 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
23410 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
23420 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
23430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23440 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
23450 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23460 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
23470 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
23480 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
23490 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
234a0 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
234b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
234c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
234d0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
234e0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
234f0 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
23500 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
23510 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
23520 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
23530 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
23540 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
23550 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
23560 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23570 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
23580 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
23590 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
235a0 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
235b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
235c0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
235d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
235e0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
235f0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
23600 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
23610 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
23620 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23630 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
23640 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
23650 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
23660 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23670 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
23680 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23690 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
236a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
236b0 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
236c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
236d0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
236e0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
236f0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
23700 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
23710 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
23720 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
23730 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
23740 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
23750 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
23760 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
23770 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
23780 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
23790 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
237a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
237b0 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
237c0 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
237d0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
237e0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
237f0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
23800 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
23810 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
23820 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
23830 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
23840 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
23850 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
23860 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
23870 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23880 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
23890 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
238a0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
238b0 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
238c0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
238d0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
238e0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
238f0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
23900 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
23910 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
23920 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
23930 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
23940 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23950 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
23960 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
23970 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
23980 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
23990 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
239a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
239b0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
239c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
239d0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
239e0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
239f0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
23a00 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
23a10 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
23a20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
23a30 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
23a40 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
23a50 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
23a60 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
23a70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
23a80 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
23a90 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
23aa0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
23ab0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
23ac0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23ad0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
23ae0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
23af0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
23b00 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
23b10 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
23b20 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
23b30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
23b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23b50 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23b60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23b70 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
23b80 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
23b90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
23ba0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
23bb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
23bc0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
23bd0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f  he integer key o
23be0 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20  r "rowid" for a 
23bf0 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20  table btree..** 
23c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23c10 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61  only valid for a
23c20 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20   cursor that is 
23c30 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a  pointing into a.
23c40 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  ** ordinary tabl
23c50 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  e btree.  If the
23c60 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
23c70 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65  o an index btree
23c80 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69   or.** is invali
23c90 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  d, the result of
23ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23cb0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
23cc0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  64 sqlite3BtreeI
23cd0 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73  ntegerKey(BtCurs
23ce0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
23cf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23d00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23d10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23d20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23d30 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23d40 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
23d50 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
23d60 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
23d70 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  n pCur->info.nKe
23d80 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
23d90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23da0 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
23db0 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  d for the entry 
23dc0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
23dd0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23de0 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c  ng to.  For tabl
23df0 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  e btrees, this w
23e00 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e  ill be the amoun
23e10 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46  t.** of data.  F
23e20 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c  or index btrees,
23e30 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
23e40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65  e size of the ke
23e50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
23e60 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
23e70 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
23e80 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23e90 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
23ea0 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
23eb0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
23ec0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23ed0 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
23ee0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
23ef0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
23f00 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
23f10 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71  VALID..*/.u32 sq
23f20 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
23f30 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  dSize(BtCursor *
23f40 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
23f50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23f60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23f70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23f80 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23f90 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23fa0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
23fb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
23fc0 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  load;.}../*.** G
23fd0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
23fe0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
23ff0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
24000 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
24010 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
24020 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
24030 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
24040 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
24050 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
24060 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
24070 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
24080 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
24090 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
240a0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
240b0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
240c0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
240d0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
240e0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
240f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
24100 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
24110 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24120 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
24130 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
24140 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24150 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
24160 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
24170 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
24180 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
24190 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
241a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
241b0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
241c0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
241d0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
241e0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
241f0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
24200 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
24210 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
24220 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
24230 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
24240 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
24250 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
24260 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
24270 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
24280 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
24290 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
242a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
242b0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
242c0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
242d0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
242e0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
242f0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
24300 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
24310 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
24320 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
24330 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
24340 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
24350 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
24360 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24370 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
24380 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
24390 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
243a0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
243b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
243c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
243d0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243f0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
24400 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
24410 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
24420 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
24430 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
24440 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
24450 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
24460 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
24470 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
24480 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24490 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
244a0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
244b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
244c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
244d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
244e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
244f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
24500 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
24510 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
24520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24530 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24540 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
24550 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24560 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24570 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
24580 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
24590 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
245a0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
245b0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
245c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
245d0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
245e0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
245f0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
24600 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
24610 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
24620 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
24630 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
24640 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
24650 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24660 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
24670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
24680 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
24690 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
246a0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
246b0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
246c0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
246d0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
246e0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
246f0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
24700 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
24710 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
24720 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
24730 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
24740 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
24750 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24760 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
24770 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
24780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24790 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
247a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
247b0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
247c0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
247d0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
247e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
247f0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
24800 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
24810 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
24820 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
24830 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
24840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24850 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
24860 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
24870 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
24880 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
24890 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
248a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
248b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
248c0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
248d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
248e0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
248f0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
24900 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
24910 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
24920 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
24930 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
24940 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
24950 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
24960 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
24970 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
24980 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
24990 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
249a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
249b0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
249c0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
249d0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
249e0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
249f0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
24a00 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
24a10 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
24a20 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
24a30 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
24a40 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
24a50 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
24a60 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
24a70 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
24a80 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
24a90 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
24aa0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
24ab0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
24ac0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
24ad0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
24ae0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
24af0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
24b00 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
24b10 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
24b20 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
24b30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24b40 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
24b50 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
24b60 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
24b70 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
24b80 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
24b90 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
24ba0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
24bb0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
24bc0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
24bd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
24be0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
24bf0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
24c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24c10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
24c20 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
24c30 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
24c40 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
24c50 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
24c60 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
24c70 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
24c80 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
24c90 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
24ca0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
24cb0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
24cc0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24cd0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
24ce0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
24cf0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
24d00 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
24d10 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
24d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24d50 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
24d60 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
24d70 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
24d80 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
24d90 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
24da0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
24db0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
24dc0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
24dd0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
24de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24e00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24e10 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
24e20 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
24e30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
24e40 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
24e50 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
24e60 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
24e70 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
24e80 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
24e90 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
24ea0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
24eb0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
24ec0 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
24ed0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24ee0 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
24ef0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
24f00 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
24f10 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24f20 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
24f30 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
24f40 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
24f50 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24f60 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
24f70 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
24f80 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
24f90 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
24fa0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
24fb0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
24fc0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
24fd0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
24fe0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
24ff0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
25000 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
25010 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
25020 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
25030 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
25040 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
25050 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
25060 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
25070 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
25080 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
25090 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
250a0 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
250b0 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
250c0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
250d0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
250e0 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
250f0 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
25100 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
25110 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
25120 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
25130 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
25140 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
25150 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
25160 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
25170 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
25180 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
25190 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
251a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
251b0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
251c0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
251d0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
251e0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
251f0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
25200 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
25210 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
25220 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
25230 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
25240 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
25250 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
25260 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
25270 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
25280 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
25290 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
252a0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
252b0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
252c0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
252d0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
252e0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
252f0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
25300 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
25310 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
25320 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
25330 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
25340 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
25350 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
25360 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
25370 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
25380 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
25390 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
253a0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
253b0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
253c0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
253d0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253f0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
25400 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
25410 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
25420 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
25430 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
25440 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25460 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
25470 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
25480 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
25490 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
254a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
254b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
254c0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
254d0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
254e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
254f0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
25500 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
25510 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
25520 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
25530 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
25540 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
25550 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
25560 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
25570 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25580 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
25590 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
255a0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
255b0 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e   pBuf;.  int bEn
255c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
255f0 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
25600 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
25610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
25620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25630 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25640 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25650 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
25670 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
25680 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25690 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
256a0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
256b0 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
256c0 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
256d0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
256e0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
256f0 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
25700 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
25710 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
25720 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
25730 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
25740 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
25750 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
25760 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
25770 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
25780 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
25790 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
257a0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
257b0 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
257c0 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
257d0 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
257e0 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
257f0 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
25800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
25810 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25820 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
25830 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
25840 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
25850 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
25860 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
25870 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
25880 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
25890 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
258a0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
258b0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
258c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
258d0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
258e0 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
258f0 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
25900 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
25910 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
25920 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
25930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25940 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25950 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
25960 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
25970 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
25980 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
25990 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
259a0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
259b0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
259c0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
259d0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
259e0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
259f0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
25a00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
25a10 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
25a20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
25a30 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
25a40 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
25a50 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
25a60 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
25a70 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
25a80 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
25a90 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
25aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
25ab0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
25ac0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
25ad0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25ae0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
25af0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
25b00 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
25b10 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
25b20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
25b30 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
25b40 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
25b50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
25b60 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
25b70 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
25b80 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
25b90 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
25ba0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
25bb0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
25bc0 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
25bd0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
25be0 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
25bf0 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c  allocate aOverfl
25c00 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e  ow[] for eOp==2.
25c10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
25c20 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
25c30 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
25c40 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
25c50 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
25c60 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
25c70 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
25c80 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25c90 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
25ca0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
25cb0 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
25cc0 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
25cd0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
25ce0 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
25cf0 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
25d00 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
25d10 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
25d20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
25d30 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
25d40 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
25d50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25d60 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
25d80 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
25d90 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
25da0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
25db0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
25dc0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
25dd0 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
25de0 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
25df0 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
25e00 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
25e10 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
25e20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25e30 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
25e40 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
25e50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
25e60 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
25e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25e80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ea0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
25eb0 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
25ec0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
25ed0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
25ee0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
25ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
25f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25f10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
25f20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
25f30 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
25f40 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
25f50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25f60 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
25f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25f80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
25f90 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25fa0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
25fb0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
25fc0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
25fd0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
25fe0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
25ff0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
26000 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
26010 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
26020 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
26030 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26040 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
26050 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
26060 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
26070 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
26080 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
26090 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
260a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
260b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
260c0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
260d0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
260e0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
260f0 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
26100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
26110 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
26120 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
26130 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
26140 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
26150 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26160 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
26170 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
26180 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
26190 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
261a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
261b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
261c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
261d0 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76      || pCur->aOv
261e0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
261f0 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  xtPage.         
26200 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
26210 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20  T_DB );.        
26220 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26230 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
26240 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26250 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
26260 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
26270 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
26280 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
26290 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
262a0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
262b0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
262c0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
262d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
262e0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
262f0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
26300 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
26310 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
26320 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
26330 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
26340 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
26350 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
26360 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
26370 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
26380 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
26390 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
263a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
263b0 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
263c0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
263d0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
263e0 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
263f0 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
26400 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
26410 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
26420 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
26430 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
26440 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
26450 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
26460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26470 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26480 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
26490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
264a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
264b0 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
264c0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
264d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
264e0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
264f0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
26500 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
26510 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
26520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26530 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
26540 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
26550 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
26560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26570 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
26580 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
26590 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
265a0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
265b0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
265c0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
265d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
265e0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
265f0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
26600 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
26610 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
26620 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
26630 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
26640 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
26650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
26660 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
26670 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
26680 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
26690 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
266a0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
266b0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
266c0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
266d0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
266e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
266f0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
26700 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
26710 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
26720 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
26730 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
26740 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
26750 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
26760 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
26770 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
26780 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
26790 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
267a0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
267b0 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
267c0 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
267d0 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
267e0 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
267f0 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
26800 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
26810 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
26820 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26830 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
26840 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
26850 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
26860 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
26870 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
26880 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61    **   7) at lea
26890 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
268a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
268b0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
268c0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
268d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
268e0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
268f0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
26900 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
26910 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
26920 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
26930 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
26940 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
26950 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
26960 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
26970 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
26980 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
26990 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
269a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
269b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
269c0 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
269d0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
26a00 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
26a10 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
26a50 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
26a60 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
26a90 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
26aa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
26ab0 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
26ae0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
26af0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
26b00 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
26b10 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
26b20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26b30 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
26b40 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
26b70 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
26b80 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bb0 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (7) */.        )
26bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
26bd0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
26be0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
26bf0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
26c00 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
26c10 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
26c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e            /* hen
26c40 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  ce (7) */.      
26c50 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
26c60 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
26c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26c80 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
26c90 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
26ca0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
26cb0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
26cc0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26cd0 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
26ce0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
26cf0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
26d00 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
26d10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
26d20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
26d30 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
26d40 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
26d50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26d60 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
26d70 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
26d80 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
26d90 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30    ((eOp&0x01)==0
26da0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26db0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
26dc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26df0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
26e00 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
26e10 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
26e20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26e30 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
26e40 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
26e50 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
26e60 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
26e70 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
26e80 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44  , (eOp&0x01), pD
26e90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26ea0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26eb0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
26ed0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
26ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26ef0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
26f00 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
26f10 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
26f20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26f30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
26f40 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
26f50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26f60 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
26f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26f80 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
26f90 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
26fa0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
26fb0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
26fc0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
26fd0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
26fe0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
26ff0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27000 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
27010 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
27020 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
27030 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
27040 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
27050 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
27060 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
27070 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
27080 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
27090 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
270a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
270b0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
270c0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
270d0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
270e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
270f0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
27100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27110 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
27120 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
27130 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
27140 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
27150 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27160 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27180 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27190 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
271a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
271b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
271c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
271d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
271e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
271f0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27200 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27210 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
27220 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27230 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
27240 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
27250 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
27260 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
27270 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
27280 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
27290 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
272a0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
272b0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
272c0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
272d0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
272e0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
272f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
27300 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
27310 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
27320 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
27330 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
27340 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
27350 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
27360 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
27370 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
27380 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
27390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
273a0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
273b0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
273c0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
273d0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
273e0 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
273f0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
27400 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
27410 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27420 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
27430 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
27440 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
27450 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27460 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27470 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27480 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
27490 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
274a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
274b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
274c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
274d0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
274e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
274f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
27500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
27510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27520 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27530 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27540 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27550 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27560 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
27570 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
27580 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
27590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
275a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
275b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
275c0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
275d0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
275e0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
275f0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
27600 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
27610 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
27620 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
27630 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
27640 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
27650 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
27660 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
27670 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
27680 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
27690 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
276a0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
276b0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
276c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
276d0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
276e0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
276f0 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
27700 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
27710 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
27720 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27730 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
27740 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
27750 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
27760 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
27770 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
27780 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
27790 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
277a0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
277b0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
277c0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
277d0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
277e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
277f0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
27800 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
27810 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
27820 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
27830 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
27840 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
27850 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
27860 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
27870 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
27880 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
27890 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
278a0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
278b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
278c0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
278d0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
278e0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
278f0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
27900 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
27910 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
27920 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
27930 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
27940 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
27950 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
27960 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
27970 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
27980 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
27990 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
279a0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
279b0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
279c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
279d0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
279e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
279f0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
27a00 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
27a10 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20  .){.  u32 amt;. 
27a20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
27a30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
27a40 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
27a50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27a70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27a80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
27a90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27aa0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
27ab0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
27ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
27ad0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27ae0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27af0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27b00 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27b10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27b20 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
27b30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b40 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
27b50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b60 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43  info.pPayload>pC
27b70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27b80 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c  >iPage]->aData |
27b90 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
27ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27bb0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43  info.pPayload<pC
27bc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27bd0 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
27be0 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
27bf0 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70  .  amt = (int)(p
27c00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27c10 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
27c20 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
27c30 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28  pPayload);.  if(
27c40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27c50 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70  al<amt ) amt = p
27c60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27c70 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b  ;.  *pAmt = amt;
27c80 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
27c90 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  )pCur->info.pPay
27ca0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
27cb0 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
27cc0 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
27cd0 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
27ce0 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
27cf0 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
27d00 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
27d10 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
27d20 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
27d30 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
27d40 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
27d50 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
27d60 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
27d70 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
27d80 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
27d90 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
27da0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
27db0 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
27dc0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
27dd0 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
27de0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
27df0 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
27e00 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
27e10 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
27e20 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
27e30 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
27e40 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
27e50 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
27e60 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
27e70 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
27e80 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
27e90 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
27ea0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
27eb0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
27ec0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
27ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
27ee0 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
27ef0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
27f00 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63  BtreePayloadFetc
27f10 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
27f20 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
27f30 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
27f40 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
27f50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
27f60 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27f70 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
27f80 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
27f90 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
27fa0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
27fb0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27fc0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
27fd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27fe0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
27ff0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
28000 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
28010 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
28020 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
28030 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
28040 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
28050 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
28060 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
28070 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
28080 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
28090 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
280a0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
280b0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
280c0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
280d0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
280e0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
280f0 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
28100 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
28110 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28120 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28130 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28140 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28150 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
28160 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28170 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
28180 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
28190 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
281a0 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
281b0 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
281c0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
281d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
281e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
281f0 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
28200 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
28210 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
28220 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
28230 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
28240 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Ovfl);.  pCur->i
28250 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e  Page++;.  pCur->
28260 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28270 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e] = 0;.  return
28280 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
28290 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
282a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
282b0 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75    pCur, pCur->cu
282e0 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a  rPagerFlags);.}.
282f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
28300 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
28310 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
28320 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
28330 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
28340 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
28350 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
28360 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
28370 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
28380 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
28390 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
283a0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
283b0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
283c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
283d0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
283e0 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
283f0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
28400 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
28410 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
28420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28430 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
28440 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
28450 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
28460 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
28470 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
28480 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
28490 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
284a0 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
284b0 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
284e0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
284f0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
28500 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
28510 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
28520 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
28530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28540 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
28550 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
28560 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
28570 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
28580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28590 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
285a0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
285b0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
285c0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
285d0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
285e0 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
285f0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
28600 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
28610 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
28620 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
28630 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
28640 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
28650 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
28660 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
28670 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
28680 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
28690 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
286a0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
286b0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
286c0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
286d0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
286e0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
286f0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
28700 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
28710 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
28720 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
28730 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28740 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28760 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28770 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28780 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
28790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
287a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
287b0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
287c0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
287d0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
287e0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
287f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
28800 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
28810 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
28820 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28830 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
28840 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
28850 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
28860 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
28870 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
28880 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
28890 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
288a0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
288b0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
288c0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
288d0 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65  Ovfl);.  release
288e0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
288f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28900 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
28910 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28920 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
28930 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
28940 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
28950 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
28960 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
28970 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
28980 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
28990 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
289a0 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
289b0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
289c0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
289d0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
289e0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
289f0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
28a00 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
28a10 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
28a20 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
28a30 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
28a40 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
28a50 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
28a60 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
28a70 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
28a80 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
28a90 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
28aa0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
28ab0 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
28ac0 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
28ad0 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
28ae0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
28af0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
28b00 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
28b10 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
28b20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
28b30 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
28b40 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
28b50 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
28b60 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
28b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
28b80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
28b90 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
28ba0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
28bb0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
28bc0 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
28bd0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
28be0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
28bf0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
28c00 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
28c10 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
28c20 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
28c30 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
28c40 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
28c50 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
28c60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
28c70 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
28c80 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
28c90 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
28ca0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
28cb0 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
28cc0 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
28cd0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
28ce0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28cf0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
28d00 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
28d10 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
28d20 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
28d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28d40 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
28d50 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
28d60 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
28d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28d80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28d90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28da0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28db0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28dc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
28dd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
28de0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
28df0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
28e00 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
28e10 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
28e20 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
28e30 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
28e40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
28e50 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28e60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
28e70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28e80 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
28e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28ea0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
28eb0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
28ec0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
28ed0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
28ee0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28ef0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
28f00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28f10 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
28f20 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
28f30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28f40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28f50 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
28f60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
28f70 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
28f80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28f90 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
28fa0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
28fb0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
28fc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28fd0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28ff0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29010 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
29020 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
29030 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
29040 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
29050 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
29060 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
29090 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
290a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
290b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
290c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
290d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
290e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
290f0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
29100 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
29110 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
29120 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
29130 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
29140 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
29150 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
29160 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
29170 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
29180 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
29190 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
291a0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
291b0 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
291c0 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
291d0 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
291e0 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
291f0 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
29200 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
29210 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
29220 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
29230 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
29240 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
29250 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
29260 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
29270 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
29280 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
29290 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
292a0 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
292b0 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
292c0 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
292d0 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
292e0 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
292f0 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
29300 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
29310 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
29320 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
29330 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
29340 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
29350 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
29360 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
29370 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
29380 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
29390 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
293a0 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
293b0 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
293c0 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
293d0 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
293e0 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
293f0 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
29400 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
29410 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
29420 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
29430 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
29440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
29460 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
29470 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29480 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29490 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
294a0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
294b0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
294c0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
294d0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
294e0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
294f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29500 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
29510 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
29520 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
29530 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
29540 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
29550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29560 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29570 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
29580 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
29590 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
295a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
295b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
295c0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
295d0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
295e0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
295f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
29600 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29610 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
29620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29630 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
29640 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
29650 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
29660 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29670 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
29680 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
29690 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
296a0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
296b0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
296c0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
296d0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
296e0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
296f0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29700 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
29710 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
29720 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29730 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
29740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
29750 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
29760 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29770 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29790 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
297a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
297b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
297c0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
297d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
297e0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
297f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29800 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29810 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
29820 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
29830 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
29840 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29850 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29860 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
29870 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29880 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
29890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
298a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
298b0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
298c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
298d0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
298e0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
298f0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
29900 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
29910 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
29920 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
29930 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
29940 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
29950 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
29960 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
29970 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
29980 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29990 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
299a0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
299b0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
299c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
299d0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
299e0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
299f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
29a00 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
29a10 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
29a20 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
29a30 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
29a40 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29a50 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
29a60 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
29a70 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
29a80 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
29a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
29aa0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29ab0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ac0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29ad0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29ae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29af0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29b00 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
29b10 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29b20 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29b30 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
29b40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29b50 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29b60 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
29b70 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29b80 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29b90 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
29ba0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29bb0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
29bc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29bd0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
29be0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29bf0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29c00 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
29c10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29c20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29c30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29c40 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29c50 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
29c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29c70 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29c80 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
29c90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29ca0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29cb0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29cc0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29cd0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29ce0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29cf0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29d00 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
29d10 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
29d20 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29d30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
29d40 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
29d50 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29d60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
29d70 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29d80 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29d90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29da0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29db0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29dc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
29dd0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
29de0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
29df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29e00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29e10 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
29e20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29e30 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
29e40 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
29e50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29e60 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
29e70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
29e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
29ea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29eb0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
29ec0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
29ed0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
29ee0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
29ef0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29f00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
29f10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29f20 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
29f30 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
29f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
29f50 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
29f60 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
29f70 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
29f80 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
29f90 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
29fa0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
29fb0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
29fc0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
29fd0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
29fe0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
29ff0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2a000 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2a010 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a020 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a030 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a040 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a050 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a060 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2a070 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2a080 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2a090 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2a0a0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2a0b0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2a0c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2a0d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a0e0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a0f0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2a100 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2a110 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2a120 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2a130 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2a140 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2a150 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2a160 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a170 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2a180 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2a190 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2a1a0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2a1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a1c0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2a1d0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2a1e0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2a1f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a200 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a210 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
2a220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a230 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2a240 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2a250 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a260 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2a270 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a280 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2a290 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a2a0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a2c0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2a2d0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a2e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a2f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a300 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a310 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a320 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a330 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a360 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a370 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2a380 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2a390 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a3a0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2a3b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a3c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a3d0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2a3e0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a400 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a410 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2a420 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2a430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a440 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2a450 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2a460 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2a470 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2a480 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2a490 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2a4a0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2a4b0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2a4c0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2a4d0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2a4e0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2a4f0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2a500 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2a510 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2a520 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2a530 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2a540 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2a550 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2a560 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2a570 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2a580 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2a590 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2a5a0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2a5b0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2a5c0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2a5d0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2a5e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2a5f0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2a600 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2a610 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2a620 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2a630 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2a640 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2a650 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2a660 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2a670 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2a680 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2a690 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2a6a0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2a6b0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2a6c0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2a6d0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2a6e0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2a6f0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2a700 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2a710 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2a720 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2a730 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2a740 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2a750 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2a760 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2a770 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2a780 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2a790 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2a7a0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2a7b0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2a7c0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2a7d0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2a7e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a7f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a800 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a820 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2a830 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2a840 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2a850 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2a860 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a870 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a880 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a890 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2a8a0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2a8b0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2a8c0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2a8d0 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2a8e0 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2a8f0 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2a900 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2a910 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2a920 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2a930 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2a940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a950 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2a960 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2a970 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2a980 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2a990 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2a9a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2a9b0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2a9c0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2a9d0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a9f0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2aa00 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2aa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2aa20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2aa30 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2aa40 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2aa50 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2aa60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2aa70 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2aa80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2aa90 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2aaa0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2aab0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2aac0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2aad0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2aae0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2aaf0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2ab00 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2ab10 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2ab20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2ab30 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ab40 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2ab50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2ab60 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2ab70 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2ab80 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2ab90 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2aba0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2abb0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2abc0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2abd0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
2abe0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2abf0 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
2ac00 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2ac10 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26  lidNKey)!=0.   &
2ac20 26 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  & pCur->curIntKe
2ac30 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
2ac40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2ac50 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2ac60 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ac70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ac80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2ac90 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2aca0 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2acb0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
2acc0 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2acd0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
2ace0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2acf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2ad00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2ad10 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2ad20 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2ad30 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2ad40 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2ad50 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2ad60 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2ad70 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2ad80 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2ad90 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2ada0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2adb0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2adc0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2add0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2ade0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2adf0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2ae00 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2ae10 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2ae20 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2ae30 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2ae40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ae50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2ae60 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2ae70 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2ae80 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2ae90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aea0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2aeb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2aec0 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2aed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2aee0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2aef0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2af00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2af10 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2af20 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2af30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2af40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2af50 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2af60 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2af70 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2af80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2af90 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2afa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2afb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2afc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2afd0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2afe0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2aff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b000 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2b010 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2b020 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2b030 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2b040 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2b050 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2b060 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b070 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b080 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b0b0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2b0c0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2b0d0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2b0e0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2b0f0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2b100 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2b110 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2b120 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2b130 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2b140 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2b150 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2b160 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2b170 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b180 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2b190 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2b1a0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2b1b0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2b1c0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2b1d0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2b1e0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2b1f0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2b200 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2b210 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2b220 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2b230 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2b240 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2b250 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2b260 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2b270 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2b280 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2b290 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2b2a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b2b0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2b2c0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2b2d0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2b2e0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2b2f0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2b300 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2b310 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2b320 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2b330 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2b340 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2b350 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2b360 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2b370 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b380 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b390 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2b3a0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2b3b0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2b3c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2b3d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2b3e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2b3f0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2b400 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2b410 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2b420 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2b430 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2b440 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2b450 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2b460 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2b470 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
2b480 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2b4b0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2b4c0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2b4d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2b4e0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2b4f0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2b500 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2b510 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2b520 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2b530 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2b540 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2b550 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2b560 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2b570 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2b580 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2b590 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2b5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b5b0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2b5c0 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2b5d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2b5e0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2b5f0 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2b600 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2b610 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2b620 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2b630 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b640 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2b650 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2b660 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b670 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2b680 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2b690 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2b6a0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2b6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b6c0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b6d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b6e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2b6f0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b700 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2b710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b720 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b730 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2b740 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2b750 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2b760 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2b770 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2b780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2b790 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2b7a0 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2b7b0 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2b7c0 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2b7d0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2b7e0 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2b7f0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2b800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2b810 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2b820 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2b830 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2b840 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2b850 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2b860 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2b870 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2b880 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2b890 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2b8a0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2b8b0 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2b8c0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2b8d0 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2b8e0 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2b8f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2b900 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2b910 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2b920 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2b930 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2b940 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2b950 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2b960 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2b970 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2b980 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2b990 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2b9a0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2b9b0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2b9c0 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2b9d0 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2b9e0 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2b9f0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2ba00 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2ba10 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2ba20 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2ba30 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2ba40 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2ba50 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2ba60 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2ba70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2ba80 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2ba90 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2baa0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2bab0 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2bac0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2bad0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2bae0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2baf0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2bb00 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2bb10 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2bb20 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2bb30 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2bb40 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2bb50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bb60 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2bb70 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2bb80 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2bb90 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2bba0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2bbb0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bbd0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2bbe0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2bbf0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2bc00 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2bc10 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2bc20 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2bc30 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2bc40 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2bc50 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2bc60 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2bc70 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2bc80 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2bc90 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2bca0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2bcb0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2bcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bcd0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2bce0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2bcf0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2bd00 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2bd10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2bd20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2bd30 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2bd40 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2bd50 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2bd60 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2bd70 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2bd80 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2bd90 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2bda0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2bdb0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2bdc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2bdd0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2bde0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2bdf0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2be00 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2be10 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2be20 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2be30 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2be40 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2be50 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2be60 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2be70 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2be80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2be90 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2bea0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2beb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2bec0 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2bed0 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2bee0 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2bef0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2bf00 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2bf10 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2bf20 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2bf30 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2bf40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2bf50 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2bf60 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2bf70 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2bf80 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2bf90 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2bfa0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2bfb0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2bfc0 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2bfd0 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2bfe0 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2bff0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c000 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2c010 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2c020 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2c030 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2c040 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2c050 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2c060 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2c070 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2c080 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2c090 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2c0a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2c0b0 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2c0c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2c0d0 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2c0e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c0f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c100 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2c110 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c120 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c130 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2c140 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2c150 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2c160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c170 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2c180 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2c190 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c1b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c1d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2c1e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c1f0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c200 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2c210 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2c220 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2c230 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2c240 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
2c250 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2c260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c270 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2c280 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c290 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c2a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c2b0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2c2c0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2c2d0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2c2e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c2f0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2c300 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2c310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2c320 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2c330 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2c340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2c350 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2c360 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2c370 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2c380 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2c390 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2c3a0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2c3b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2c3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2c3d0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2c3e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2c3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2c400 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2c410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c420 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2c430 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2c440 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c460 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2c470 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c480 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c4a0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c4b0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2c4c0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c4d0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c4e0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2c4f0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2c500 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2c510 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2c520 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2c530 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2c540 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2c550 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2c560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c570 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2c580 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2c590 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2c5a0 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2c5b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c5c0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2c5d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c5f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c600 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2c610 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c620 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2c630 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c640 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c650 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2c660 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2c670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c680 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c690 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2c6a0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2c6b0 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2c6c0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2c6d0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2c6e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c6f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c700 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2c710 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2c720 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c730 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2c740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2c750 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c760 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2c770 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c780 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2c790 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2c7a0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2c7b0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2c7c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2c7d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2c7e0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2c7f0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2c800 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2c810 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2c820 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2c830 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2c840 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c850 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2c860 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2c870 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2c880 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2c890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c8a0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2c8b0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2c8c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2c8d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c8e0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2c8f0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2c900 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2c910 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2c920 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2c930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c940 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2c950 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2c960 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2c970 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2c980 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2c990 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2c9a0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2c9b0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2c9c0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2c9d0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2c9e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2c9f0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2ca00 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2ca10 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2ca20 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2ca30 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2ca40 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2ca50 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2ca60 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2ca70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2ca80 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2ca90 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2caa0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2cab0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2cac0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2cad0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2cae0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2caf0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2cb00 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2cb10 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2cb20 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2cb30 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2cb40 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2cb50 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2cb60 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2cb70 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2cb80 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2cb90 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2cba0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2cbb0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2cbc0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2cbd0 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2cbe0 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2cbf0 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2cc00 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2cc10 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2cc20 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2cc30 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2cc40 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2cc50 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2cc60 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2cc70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2cc80 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2cc90 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2cca0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2ccb0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2ccc0 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2ccd0 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2cce0 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2ccf0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2cd00 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2cd10 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2cd20 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2cd30 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2cd40 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2cd50 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2cd60 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2cd70 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2cd80 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2cd90 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2cda0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2cdb0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2cdc0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2cdd0 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2cde0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2cdf0 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2ce00 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2ce10 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2ce20 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2ce30 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ce40 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2ce50 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2ce60 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2ce70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2ce80 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2ce90 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2cea0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2ceb0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2cec0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2ced0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2cee0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2cef0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2cf00 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2cf10 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2cf20 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2cf30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2cf40 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2cf50 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2cf60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2cf70 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2cf80 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2cf90 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2cfa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2cfb0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2cfc0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2cfd0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2cfe0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2cff0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2d000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d020 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d030 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2d040 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2d050 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2d060 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2d070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2d090 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2d0a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d0b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d0c0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2d0d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d0e0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2d0f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d100 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2d110 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2d120 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2d130 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d140 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2d150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d160 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d170 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d180 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2d190 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d1a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d1b0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2d1c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d1d0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2d1e0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d1f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2d200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d210 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2d220 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2d230 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2d240 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2d250 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2d260 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2d270 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2d280 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2d290 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2d2a0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2d2b0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2d2c0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2d2d0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2d2e0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2d2f0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2d300 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2d310 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2d320 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2d330 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2d340 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2d350 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2d360 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2d370 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2d380 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2d390 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d3a0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2d3b0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2d3c0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2d3d0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d3e0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2d3f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d400 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2d410 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d420 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2d430 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2d440 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2d450 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2d460 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2d470 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d480 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2d490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d4a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d4b0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2d4c0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2d4d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d4e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d4f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2d500 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d510 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2d520 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2d530 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2d540 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2d550 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2d560 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2d570 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2d580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d590 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2d5a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d5b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d5c0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d5d0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d5e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2d5f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2d600 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2d610 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2d620 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2d630 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2d640 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d650 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2d660 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2d670 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2d680 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2d690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d6a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2d6b0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2d6c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2d6d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d6e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2d6f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d700 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2d710 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2d720 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2d730 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d740 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2d750 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d760 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2d770 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d780 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d790 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2d7a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d7b0 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2d7c0 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2d7d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d7e0 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2d7f0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2d800 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2d810 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2d820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d830 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d840 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d850 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d860 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2d870 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2d880 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2d890 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2d8a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2d8b0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2d8c0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2d8d0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2d8e0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2d8f0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2d900 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2d910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2d920 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2d930 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2d940 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2d950 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2d960 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2d970 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2d980 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2d990 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2d9a0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2d9b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2d9c0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2d9d0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2d9e0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2d9f0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2da00 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2da10 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2da20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2da30 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2da40 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2da50 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2da60 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2da70 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2da80 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2da90 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2daa0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2dab0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2dac0 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2dad0 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2dae0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2daf0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2db00 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2db10 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2db20 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2db30 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2db40 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2db50 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2db60 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2db70 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2db80 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2db90 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2dba0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2dbb0 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2dbc0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2dbd0 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2dbe0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2dbf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2dc00 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2dc10 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2dc20 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2dc30 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2dc40 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2dc50 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2dc60 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dc70 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2dc80 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2dc90 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2dca0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2dcb0 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2dcc0 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2dcd0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2dce0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2dcf0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2dd00 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2dd10 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2dd20 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2dd30 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2dd40 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2dd50 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2dd60 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2dd70 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2dd80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2dd90 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2dda0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2ddb0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ddc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2ddd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2dde0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2ddf0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2de00 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2de10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2de20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2de30 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2de40 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2de50 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2de60 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2de70 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2de80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2de90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2dea0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2deb0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2dec0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ded0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2dee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2def0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2df00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2df10 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2df20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2df30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2df40 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2df50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2df60 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2df70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2df80 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2df90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2dfa0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2dfb0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2dfc0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2dfd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dfe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dff0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e000 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2e010 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e020 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e030 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2e040 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2e050 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e060 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2e070 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2e080 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2e090 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2e0a0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2e0b0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2e0c0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2e0d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e0e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2e0f0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2e100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2e110 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2e120 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2e130 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2e140 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2e150 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2e160 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2e170 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2e180 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2e190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e1a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2e1b0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2e1c0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2e1d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2e1e0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2e1f0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2e200 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2e210 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e220 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2e230 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
2e240 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e250 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
2e260 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e270 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2e280 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e290 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2e2a0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e2b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e2c0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2e2d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e2e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e2f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2e300 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2e310 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e320 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2e330 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2e340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e350 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e360 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e370 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2e380 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2e390 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2e3a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e3b0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2e3c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e3d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2e3e0 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2e3f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2e400 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2e410 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2e420 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2e430 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e440 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e450 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e460 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2e470 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e480 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2e490 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e4a0 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2e4b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2e4c0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2e4d0 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2e4e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e4f0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2e500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e510 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2e520 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2e530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e540 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2e550 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2e560 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2e570 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2e580 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2e590 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2e5a0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2e5b0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2e5c0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2e5d0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2e5e0 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2e5f0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2e600 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2e610 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2e620 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e630 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2e640 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2e650 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2e660 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2e670 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2e680 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2e690 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2e6a0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2e6b0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
2e6c0 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
2e6d0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
2e6e0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2e6f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2e700 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2e710 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2e720 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2e730 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2e740 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2e750 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2e760 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2e770 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2e780 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2e790 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2e7a0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2e7b0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2e7c0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2e7d0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2e7e0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2e7f0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2e800 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2e810 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2e820 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2e830 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2e840 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2e850 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2e860 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2e870 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2e880 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2e890 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2e8a0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2e8b0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2e8c0 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2e8d0 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2e8e0 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2e8f0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2e900 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2e910 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2e920 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2e930 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2e940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2e950 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e960 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e970 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e980 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2e990 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2e9a0 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2e9b0 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2e9c0 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2e9d0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2e9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2e9f0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2ea00 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2ea10 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2ea20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2ea30 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2ea40 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2ea50 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2ea60 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2ea70 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2ea80 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2ea90 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2eaa0 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2eab0 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2eac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2ead0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2eae0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2eaf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2eb00 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2eb10 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2eb20 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2eb30 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2eb40 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2eb50 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2eb60 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2eb70 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2eb80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2eb90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2eba0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ebb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2ebc0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2ebd0 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2ebe0 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2ebf0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2ec00 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2ec10 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2ec20 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2ec30 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2ec40 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2ec50 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2ec60 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2ec70 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2ec80 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2ec90 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2eca0 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2ecb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2ecc0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2ecd0 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2ece0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2ecf0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2ed00 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2ed10 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2ed20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ed30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ed40 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2ed50 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2ed60 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2ed70 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2ed80 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2ed90 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2eda0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2edb0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2edc0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2edd0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2ede0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2edf0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
2ee00 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
2ee10 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
2ee20 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
2ee30 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
2ee40 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
2ee50 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2ee60 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
2ee70 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2ee80 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
2ee90 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2eea0 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
2eeb0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2eec0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
2eed0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
2eee0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
2eef0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
2ef00 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2ef10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ef20 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
2ef30 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2ef40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2ef50 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
2ef60 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2ef70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ef80 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
2ef90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2efa0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2efb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2efc0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
2efd0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
2efe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2eff0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f000 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
2f010 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2f020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
2f030 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2f040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
2f060 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2f070 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
2f080 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
2f090 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
2f0a0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
2f0b0 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
2f0c0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
2f0d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
2f0e0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
2f0f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2f100 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
2f110 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
2f120 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2f130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f140 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2f150 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2f160 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
2f170 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2f180 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
2f190 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
2f1a0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
2f1b0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
2f1c0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
2f1d0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
2f1e0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
2f1f0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
2f200 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
2f210 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
2f220 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
2f230 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
2f240 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2f250 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2f260 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f270 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
2f280 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
2f290 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
2f2a0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2f2b0 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
2f2c0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
2f2d0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
2f2e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
2f2f0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
2f300 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2f310 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
2f320 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
2f330 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2f340 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2f350 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
2f360 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2f370 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
2f380 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2f390 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
2f3a0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
2f3b0 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
2f3c0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f3d0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
2f3e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2f3f0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2f400 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2f410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f420 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2f430 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
2f440 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2f450 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2f460 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
2f470 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
2f480 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2f490 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2f4a0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
2f4b0 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
2f4c0 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
2f4d0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
2f4e0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2f4f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2f500 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2f510 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
2f520 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
2f530 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
2f540 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
2f550 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
2f560 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f580 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2f590 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2f5a0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f5b0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2f5c0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2f5d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2f5f0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2f600 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f610 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2f620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f630 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2f640 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2f650 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2f660 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f670 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2f680 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2f690 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2f6a0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2f6b0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2f6c0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2f6d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2f6e0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2f6f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2f700 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2f710 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2f720 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2f730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2f740 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2f750 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2f760 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2f770 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2f780 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2f790 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2f7a0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2f7b0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2f7c0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2f7d0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2f7e0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2f7f0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2f800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f810 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2f820 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f830 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f840 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f850 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f870 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2f880 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2f890 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2f8a0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2f8b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2f8c0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2f8d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2f8e0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2f8f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2f900 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2f910 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2f920 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2f930 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2f940 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2f950 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2f960 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2f970 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2f980 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2f990 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2f9a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2f9b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2f9c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2f9d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f9e0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2f9f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2fa00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2fa10 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2fa20 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2fa30 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2fa40 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2fa50 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2fa60 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2fa70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2fa80 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2fa90 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2faa0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2fab0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2fac0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2fad0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2fae0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2faf0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2fb00 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2fb10 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2fb20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2fb30 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2fb40 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2fb50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fb60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2fb70 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2fb80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2fb90 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2fba0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fbb0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2fbc0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2fbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fbe0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2fbf0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2fc00 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2fc10 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2fc20 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fc30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fc40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fc50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fc60 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2fc70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2fc80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fc90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fca0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fcb0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fcc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fcd0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fce0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2fcf0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2fd00 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fd20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fd30 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2fd40 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2fd50 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2fd60 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2fd70 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2fd80 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2fd90 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2fda0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2fdb0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2fdc0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2fdd0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2fde0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2fdf0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2fe00 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2fe10 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2fe20 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2fe30 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2fe40 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2fe50 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2fe60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2fe70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fe80 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2fe90 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fea0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2feb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2fec0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2fed0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2fee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2fef0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2ff00 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2ff10 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2ff20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2ff30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ff40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2ff50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ff60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ff70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ff80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ff90 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2ffa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2ffb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ffc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ffd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2ffe0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2fff0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30000 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30020 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
30030 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
30040 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30050 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30060 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
30070 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
30080 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
30090 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
300a0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
300b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
300c0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
300d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
300e0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
300f0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
30100 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
30110 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
30120 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30130 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
30140 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
30150 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
30160 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
30170 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
30180 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30190 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
301a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
301b0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
301c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
301d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
301e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
301f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30200 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
30210 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
30220 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
30230 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
30240 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30260 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
30270 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
30280 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30290 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
302a0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
302b0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
302c0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
302d0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
302e0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
302f0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
30300 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
30310 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
30320 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
30330 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
30340 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
30350 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
30360 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
30370 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
30380 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
30390 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
303a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
303b0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
303c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
303d0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
303e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
303f0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
30400 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
30410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30420 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
30430 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
30440 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
30450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
304a0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
304b0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
304c0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
304d0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
304e0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
304f0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
30500 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
30510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
30520 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
30530 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
30540 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
30550 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
30560 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
30570 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
30580 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30590 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
305a0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
305c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
305d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
305e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
305f0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
30600 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
30610 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
30620 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
30630 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
30640 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
30650 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
30660 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
30670 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
30680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30690 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
306a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
306b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
306c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
306d0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
306e0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
306f0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
30700 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
30710 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
30720 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
30730 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
30740 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
30750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
30760 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
30770 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
30780 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
30790 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
307a0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
307b0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
307c0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
307d0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
307e0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30800 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
30810 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
30820 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
30830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30840 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
30850 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
30870 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30880 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30890 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
308a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
308b0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
308c0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
308d0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
308e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
308f0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30900 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
30910 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
30920 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
30930 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
30940 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
30950 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
30960 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30970 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
30980 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
30990 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
309a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
309b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
309c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
309d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
309e0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
309f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30a00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30a20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
30a30 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
30a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
30a50 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
30a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30a80 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
30a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30aa0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
30ab0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
30ac0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
30ad0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
30ae0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
30af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30b00 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
30b10 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
30b20 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
30b30 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30b40 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30b50 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
30b60 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
30b70 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
30b80 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
30b90 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
30ba0 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
30bb0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
30bc0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
30bd0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
30be0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
30bf0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
30c00 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
30c10 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
30c20 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
30c30 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
30c40 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
30c50 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
30c60 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
30c70 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
30c80 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
30c90 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
30ca0 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
30cb0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
30cc0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
30cd0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
30ce0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
30cf0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
30d00 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
30d10 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
30d20 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
30d30 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
30d40 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
30d50 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
30d60 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
30d70 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
30d80 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
30d90 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
30da0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
30db0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
30dc0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
30dd0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
30de0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
30df0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
30e00 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
30e10 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
30e20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30e30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
30e40 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
30e50 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
30e60 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
30e70 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
30e80 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
30e90 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
30ea0 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
30eb0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
30ec0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
30ed0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30ee0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
30ef0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30f00 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
30f10 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
30f20 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
30f30 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
30f40 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
30f50 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
30f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30f70 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
30f80 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30f90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30fa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
30fb0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
30fc0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
30fd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30fe0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
30ff0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
31000 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31010 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
31020 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
31030 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
31040 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
31050 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
31060 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
31070 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
31080 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
31090 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
310a0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
310b0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
310c0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
310d0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
310e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
310f0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
31100 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
31110 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
31120 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
31130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
31140 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
31150 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31160 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
31170 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
31180 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
31190 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
311a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
311b0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
311c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
311d0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
311e0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
311f0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
31200 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
31210 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
31220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31230 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
31240 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31250 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
31260 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31270 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
31280 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
31290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
312a0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
312b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
312c0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
312d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
312e0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
312f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31300 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
31310 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
31320 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
31330 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
31340 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
31350 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
31360 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
31370 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31380 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31390 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
313a0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
313b0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
313c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
313d0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
313e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
313f0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
31400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31420 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
31430 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
31440 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
31450 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
31460 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
31470 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
31480 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
31490 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
314a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
314b0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
314c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
314d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
314e0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
314f0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
31500 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31510 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
31520 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
31530 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
31540 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
31550 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31560 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
31570 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
31580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
315a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
315b0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
315c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
315d0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
315e0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
315f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
31600 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
31610 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
31620 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
31630 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
31640 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
31650 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
31660 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
31670 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
31680 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
31690 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
316a0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
316b0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
316c0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
316d0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
316e0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
316f0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
31700 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
31710 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
31720 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
31730 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
31740 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
31750 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
31760 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
31770 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
31780 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
31790 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
317a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
317b0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
317c0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
317d0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
317e0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
317f0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31810 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
31820 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
31830 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31850 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
31860 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
31870 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
31880 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
31890 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
318a0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
318b0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
318c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
318d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
318e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
318f0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
31900 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
31910 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
31940 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
31970 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
31980 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
31990 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
319a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
319b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
319c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
319d0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
319e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
319f0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
31a00 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
31a10 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
31a20 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
31a30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31a40 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
31a50 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
31a60 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
31a70 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
31a80 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
31a90 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
31aa0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
31ab0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
31ac0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
31ad0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
31ae0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
31af0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
31b00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31b10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31b20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31b30 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31b40 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
31b50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31b60 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
31b70 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31b80 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
31b90 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
31ba0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
31bb0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
31bc0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
31bd0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
31be0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
31bf0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
31c00 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
31c10 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
31c20 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
31c30 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
31c40 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
31c50 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31c60 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31c70 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
31c80 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
31c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31ca0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31cb0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
31cc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31cd0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31ce0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
31cf0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
31d00 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
31d10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
31d20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
31d30 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
31d40 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
31d50 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
31d60 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
31d70 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
31d80 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
31d90 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
31da0 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
31db0 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
31dc0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
31dd0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
31de0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
31df0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
31e00 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
31e10 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
31e20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
31e30 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
31e40 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
31e50 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
31e60 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
31e70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
31e80 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
31e90 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
31ea0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
31eb0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
31ec0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
31ed0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
31ee0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
31ef0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
31f00 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
31f10 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
31f20 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
31f30 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
31f40 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
31f50 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
31f60 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
31f70 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
31f80 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
31f90 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
31fa0 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
31fb0 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
31fc0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
31fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
31fe0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
31ff0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
32000 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
32010 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32020 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
32030 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
32040 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32050 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
32060 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
32070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32080 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32090 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
320a0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
320b0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
320c0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
320d0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
320e0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
320f0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
32100 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
32110 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
32120 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32130 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
32140 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
32160 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
32170 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
32180 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
32190 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
321a0 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
321b0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
321c0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
321d0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
321e0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
321f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
32200 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
32210 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
32220 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
32230 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
32240 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
32250 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
32260 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
32270 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
32280 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
32290 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
322a0 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
322b0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
322c0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
322d0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
322e0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
322f0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
32300 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
32310 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
32320 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
32330 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
32340 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
32350 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
32360 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
32370 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
32380 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
32390 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
323a0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
323b0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
323c0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
323d0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
323e0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
323f0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
32400 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
32410 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
32420 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
32430 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
32440 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
32450 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
32460 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
32470 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
32480 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
32490 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
324a0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
324b0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
324c0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
324d0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
324e0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
324f0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
32500 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
32510 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
32520 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
32530 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
32540 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
32550 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
32560 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32570 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
32580 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
32590 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
325a0 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
325b0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
325c0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
325d0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
325e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
325f0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
32600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32610 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
32620 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
32650 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
32660 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
32670 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
32680 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32690 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
326a0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
326b0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
326c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
326d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
326e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
326f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
32700 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
32710 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32720 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
32730 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
32740 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
32750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
32760 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32770 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
32780 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
32790 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
327a0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
327b0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
327c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
327d0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
327e0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
327f0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
32800 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
32810 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
32820 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
32830 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
32840 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
32850 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
32860 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
32870 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
32880 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
32890 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
328a0 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
328b0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
328c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
328d0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
328e0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
328f0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
32900 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
32910 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
32920 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
32930 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
32940 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
32950 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
32960 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
32970 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
32980 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
32990 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
329a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
329b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
329c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
329d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
329e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
329f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
32a00 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
32a10 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
32a20 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
32a30 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
32a40 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32a50 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
32a60 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
32a70 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
32a80 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
32a90 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
32aa0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
32ab0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
32ac0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
32ad0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
32ae0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
32af0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
32b00 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
32b10 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
32b20 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
32b30 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
32b40 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
32b50 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
32b60 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
32b70 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
32b80 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
32b90 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
32ba0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
32bb0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
32bc0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
32bd0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
32be0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
32bf0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
32c00 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
32c10 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32c20 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
32c30 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
32c40 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
32c50 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
32c60 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
32c70 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
32c80 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
32c90 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32ca0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
32cb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
32cc0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
32cd0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
32ce0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32cf0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
32d00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
32d10 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
32d20 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
32d30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32d40 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
32d50 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
32d60 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
32d70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32d80 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
32d90 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
32da0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32db0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
32dc0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
32dd0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
32de0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
32df0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
32e00 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
32e10 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
32e20 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  cal==info.nPaylo
32e30 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
32e40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
32e50 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
32e60 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
32e70 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
32e80 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
32e90 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31  ell+info.nSize-1
32ea0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
32eb0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
32ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32ed0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32ee0 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
32ef0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
32f00 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
32f10 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
32f20 65 28 70 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e  e(pCell + info.n
32f30 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73  Size - 4);.  ass
32f40 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
32f50 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
32f60 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
32f70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
32f80 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
32f90 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
32fa0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
32fb0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
32fc0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
32fd0 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
32fe0 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
32ff0 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f   && (info.nPaylo
33000 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
33010 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
33020 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
33030 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
33040 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
33050 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
33060 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
33070 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
33080 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
33090 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
330a0 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
330b0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
330c0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
330d0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
330e0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
330f0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
33100 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
33110 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
33120 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
33130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
33140 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
33150 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
33160 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33170 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
33180 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
33190 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
331a0 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
331b0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
331c0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
331d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
331e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
331f0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
33200 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
33210 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
33220 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
33230 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
33240 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
33250 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
33260 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
33270 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
33280 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
33290 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
332a0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
332b0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
332c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
332d0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
332e0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
332f0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
33300 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
33310 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
33320 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
33330 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
33340 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
33350 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
33360 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
33370 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
33380 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
33390 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
333a0 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
333b0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
333c0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
333d0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
333e0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
333f0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
33400 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
33410 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
33420 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
33430 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
33440 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
33450 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
33460 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
33470 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
33480 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
33490 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
334a0 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
334b0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
334c0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
334d0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
334e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
334f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33510 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
33520 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
33530 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
33540 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
33550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
33560 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
33570 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
33580 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33590 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
335a0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
335b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
335c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
335d0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
335e0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
335f0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
33600 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
33610 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
33620 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
33630 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
33640 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
33650 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
33660 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
33670 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
33680 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
33690 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
336a0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
336b0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
336c0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
336d0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
336e0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
336f0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
33700 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
33710 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
33720 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
33730 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
33740 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
33750 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
33760 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
33770 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
33780 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
33790 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
337a0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
337b0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
337c0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
337d0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
337e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
337f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33800 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
33810 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33820 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
33830 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
33840 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
33850 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
33860 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
33870 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70   BtreePayload *p
33880 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79  X,        /* Pay
33890 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20  load with which 
338a0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
338b0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
338c0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
338d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
338e0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
338f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
33900 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
33910 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
33920 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
33930 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
33940 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
33950 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
33960 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
33970 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33980 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
33990 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
339a0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
339b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
339c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
339d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
339e0 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
339f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33a00 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
33a10 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
33a20 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
33a30 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
33a40 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
33a50 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
33a60 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
33a70 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
33a80 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
33a90 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
33aa0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
33ab0 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
33ac0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
33ad0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
33ae0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
33af0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
33b00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33b10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
33b20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33b30 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
33b40 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
33b50 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
33b60 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
33b70 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  y ){.    nPayloa
33b80 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20  d = pX->nData + 
33b90 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70  pX->nZero;.    p
33ba0 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b  Src = pX->pData;
33bb0 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e  .    nSrc = pX->
33bc0 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  nData;.    asser
33bd0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
33be0 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49  Leaf ); /* fillI
33bf0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c  nCell() only cal
33c00 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a  led for leaves *
33c10 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  /.    nHeader +=
33c20 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
33c30 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
33c40 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65  ayload);.    nHe
33c50 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33c60 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
33c70 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e  ], *(u64*)&pX->n
33c80 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
33c90 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
33ca0 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Data==0 );.    a
33cb0 73 73 65 72 74 28 20 70 58 2d 3e 6e 5a 65 72 6f  ssert( pX->nZero
33cc0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
33cd0 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37  t( pX->nKey<=0x7
33ce0 66 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70  fffffff && pX->p
33cf0 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53  Key!=0 );.    nS
33d00 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20  rc = nPayload = 
33d10 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20  (int)pX->nKey;. 
33d20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b     pSrc = pX->pK
33d30 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  ey;.    nHeader 
33d40 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
33d50 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33d60 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20  nPayload);.  }. 
33d70 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
33d80 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
33d90 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
33da0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
33db0 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
33dc0 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
33dd0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
33de0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
33df0 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
33e00 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
33e10 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
33e20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
33e30 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
33e40 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
33e50 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
33e60 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
33e70 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
33e80 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
33e90 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
33ea0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
33eb0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33ec0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
33ed0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
33ee0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33ef0 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
33f00 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
33f10 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
33f20 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
33f30 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
33f40 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
33f50 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
33f60 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
33f70 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
33f80 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
33f90 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
33fa0 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
33fb0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
33fc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
33fd0 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
33fe0 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
33ff0 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
34000 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
34010 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
34020 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
34030 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
34040 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
34050 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
34060 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
34070 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
34080 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
34090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340a0 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
340b0 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
340c0 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
340d0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
340e0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
340f0 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
34100 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
34110 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
34120 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
34130 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
34140 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
34150 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
34160 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
34170 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
34180 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
34190 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
341a0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
341b0 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
341c0 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
341d0 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
341e0 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
341f0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
34200 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
34210 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
34220 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
34230 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
34240 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
34250 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
34260 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
34270 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
34280 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a  ey==pX->nKey );.
34290 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
342a0 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
342b0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
342c0 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
342d0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d  fo.nLocal );.  }
342e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
342f0 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
34300 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
34310 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
34320 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
34330 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
34340 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
34350 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
34360 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
34370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34380 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
34390 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
343a0 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
343b0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
343c0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
343d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
343e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
343f0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
34400 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
34410 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
34420 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
34430 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
34440 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
34450 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
34460 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
34470 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
34480 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
34490 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
344a0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
344b0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
344c0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
344d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
344e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
344f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
34500 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
34510 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
34520 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
34530 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
34540 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
34550 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
34560 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
34570 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
34580 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
34590 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
345a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
345b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
345c0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
345d0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
345e0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
345f0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
34600 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
34610 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
34620 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
34630 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
34640 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
34650 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
34660 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
34670 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
34680 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
34690 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
346a0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
346b0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
346c0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
346d0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
346e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
346f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
34700 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
34710 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
34720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
34730 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
34740 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
34750 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
34760 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
34770 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
34780 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
34790 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
347a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
347b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
347c0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
347d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
347e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
347f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34810 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
34820 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34830 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
34840 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
34850 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
34860 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
34870 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
34880 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
34890 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
348a0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
348b0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
348c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
348d0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
348e0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
348f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34900 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34910 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
34920 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
34930 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
34940 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
34950 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
34960 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
34970 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
34980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34990 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
349a0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
349b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
349c0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
349d0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
349e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
349f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34a00 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
34a10 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
34a20 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
34a30 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
34a40 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
34a50 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
34a60 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
34a70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
34a80 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34a90 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
34aa0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
34ab0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
34ac0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
34ad0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
34ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
34af0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
34b00 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
34b10 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
34b20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
34b30 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
34b40 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
34b50 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
34b60 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
34b70 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
34b80 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
34b90 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
34ba0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
34bb0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
34bc0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
34bd0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34be0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
34bf0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
34c00 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
34c10 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34c20 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34c30 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34c40 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
34c50 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
34c60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
34c70 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
34c80 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
34c90 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
34ca0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
34cb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
34cc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34cd0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
34ce0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
34cf0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
34d00 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
34d10 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
34d20 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
34d30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
34d40 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
34d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d60 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
34d70 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
34d80 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
34d90 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
34da0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
34db0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
34dc0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
34dd0 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  -= n;.  }.  rele
34de0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34df0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
34e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34e10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
34e20 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
34e30 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34e40 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
34e50 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
34e60 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
34e70 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
34e80 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
34e90 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
34ea0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
34eb0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
34ec0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
34ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
34ee0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
34ef0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34f00 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
34f10 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
34f20 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
34f30 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
34f40 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
34f50 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
34f60 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
34f70 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
34f80 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
34f90 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
34fa0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
34fb0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
34fc0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
34fd0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
34fe0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
34ff0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
35000 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
35010 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
35020 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
35030 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
35040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
35050 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
35060 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
35070 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
35080 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
35090 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
350a0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
350b0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
350c0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
350d0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
350e0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
350f0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
35100 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
35110 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
35120 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35130 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
35140 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
35150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
35170 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
35180 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
35190 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
351a0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
351b0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
351c0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
351d0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
351e0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
351f0 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
35200 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
35210 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
35220 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
35230 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
35240 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
35250 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
35260 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
35270 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
35280 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
35290 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
352a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
352b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
352c0 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
352d0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
352e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
352f0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
35300 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
35310 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
35320 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
35330 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
35340 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
35350 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
35360 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
35370 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
35380 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
35390 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
353a0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
353b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
353c0 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
353d0 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
353e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353f0 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
35400 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
35410 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
35420 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
35430 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
35440 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
35450 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
35460 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
35470 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
35480 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
35490 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
354a0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
354b0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
354c0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
354d0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
354e0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
354f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
35500 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
35510 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
35520 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
35530 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
35540 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
35550 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
35560 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35570 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
35580 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
35590 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
355a0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
355b0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
355c0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
355d0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
355e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
355f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
35600 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
35610 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
35620 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
35630 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
35640 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
35650 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
35660 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
35670 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
35680 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
35690 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
356a0 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20  **.** *pRC must 
356b0 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  be SQLITE_OK whe
356c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
356d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
356e0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
356f0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
35700 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
35710 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
35720 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
35730 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
35740 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
35750 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
35760 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
35770 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
35780 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
35790 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
357a0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
357b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
357c0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
357d0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
357e0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
357f0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
35800 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
35810 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
35820 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
35830 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
35840 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
35850 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
35860 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
35870 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
35880 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
35890 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
358a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
358b0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
358c0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
358d0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
358e0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
358f0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
35900 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
35910 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
35920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35930 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
35940 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
35950 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20  8 *pIns;        
35960 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e   /* The point in
35970 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
35980 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c  [] where no cell
35990 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
359a0 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51  assert( *pRC==SQ
359b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
359c0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
359d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
359e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
359f0 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
35a00 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
35a10 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
35a20 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
35a30 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
35a40 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
35a50 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
35a60 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35a70 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
35a80 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
35a90 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
35aa0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
35ab0 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
35ac0 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
35ad0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35ae0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35af0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35b00 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
35b10 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
35b20 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
35b30 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
35b40 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
35b50 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
35b60 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
35b70 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
35b80 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
35b90 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
35ba0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
35bb0 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
35bc0 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
35bd0 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
35be0 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
35bf0 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
35c00 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
35c10 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
35c20 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
35c30 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
35c40 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
35c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
35c60 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
35c70 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
35c80 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
35c90 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
35ca0 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
35cb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
35cc0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
35cd0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
35ce0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
35cf0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
35d00 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
35d10 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
35d20 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
35d30 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
35d40 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
35d50 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
35d60 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
35d70 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
35d80 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
35d90 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
35da0 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
35db0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
35dc0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
35dd0 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
35de0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
35df0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
35e00 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ;..    /* When m
35e10 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35e20 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72  s occur, they ar
35e30 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74  e always sequent
35e40 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a  ial and in.    *
35e50 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  * sorted order. 
35e60 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73   This invariants
35e70 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d   arise because m
35e80 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35e90 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  s can.    ** onl
35ea0 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73  y occur when ins
35eb0 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63  erting divider c
35ec0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
35ed0 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67  rent page during
35ee0 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  .    ** balancin
35ef0 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  g, and the divid
35f00 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74  ers are adjacent
35f10 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20   and sorted..   
35f20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35f30 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61  j==0 || pPage->a
35f40 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29  iOvfl[j-1]<(u16)
35f50 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  i ); /* Overflow
35f60 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
35f70 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
35f80 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67   j==0 || i==pPag
35f90 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31  e->aiOvfl[j-1]+1
35fa0 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f   );   /* Overflo
35fb0 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61  ws are sequentia
35fc0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l */.  }else{.  
35fd0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
35fe0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
35ff0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
36020 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
36030 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
36040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36050 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36060 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
36070 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
36080 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
36090 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50  assert( &data[pP
360a0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d  age->cellOffset]
360b0 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  ==pPage->aCellId
360c0 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  x );.    rc = al
360d0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
360e0 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
360f0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
36100 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
36110 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
36120 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
36130 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
36140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
36150 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
36160 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
36170 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20  cessfully */.   
36180 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
36190 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
361a0 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63   idx >= pPage->c
361b0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
361c0 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f  e->nCell+2 || CO
361d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
361e0 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
361f0 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
36200 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36210 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
36220 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
36230 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
36240 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
36250 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
36260 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
36270 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
36280 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
36290 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50   }.    pIns = pP
362a0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20  age->aCellIdx + 
362b0 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  i*2;.    memmove
362c0 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32  (pIns+2, pIns, 2
362d0 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
362e0 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79   i));.    put2by
362f0 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20  te(pIns, idx);. 
36300 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
36310 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d  +;.    /* increm
36320 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ent the cell cou
36330 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b  nt */.    if( (+
36340 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  +data[pPage->hdr
36350 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20  Offset+4])==0 ) 
36360 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
36370 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20  ffset+3]++;.    
36380 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
36390 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
363a0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61  rOffset+3])==pPa
363b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66  ge->nCell );.#if
363c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
363d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
363e0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
363f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
36400 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
36410 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
36420 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
36430 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
36440 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
36450 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
36460 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
36470 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
36480 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
36490 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
364a0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
364b0 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
364c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
364d0 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79  *.** A CellArray
364e0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
364f0 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e   a cache of poin
36500 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66  ters and sizes f
36510 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74  or a.** consecut
36520 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ive sequence of 
36530 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74  cells that might
36540 20 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c   be held multipl
36550 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
36560 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
36570 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
36580 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
36590 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
365a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
365b0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
365c0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
365d0 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
365e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
365f0 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
36600 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
36610 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
36620 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
36630 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
36640 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
36650 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
36660 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
36670 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
36680 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
36690 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
366a0 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
366b0 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
366c0 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
366d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
366e0 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
366f0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
36700 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
36710 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
36720 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
36730 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
36740 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
36750 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
36760 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
36770 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
36780 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
36790 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
367a0 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
367b0 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
367c0 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
367d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
367e0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
367f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
36800 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
36810 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36820 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
36830 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
36840 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
36850 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
36860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
36870 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
36880 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
36890 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
368a0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
368b0 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
368c0 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
368d0 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
368e0 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
368f0 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
36900 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
36910 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
36920 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
36930 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36940 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36950 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
36960 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
36970 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
36980 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
36990 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
369a0 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
369b0 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
369c0 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
369d0 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
369e0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
369f0 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
36a00 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
36a10 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36a20 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
36a30 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
36a40 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
36a50 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
36a60 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
36a70 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
36a80 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
36a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
36aa0 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
36ab0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
36ac0 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
36ad0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36ae0 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
36af0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
36b00 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
36b10 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
36b20 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
36b30 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
36b40 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
36b50 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
36b60 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
36b70 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
36b80 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
36b90 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
36ba0 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
36bb0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
36bc0 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
36bd0 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
36be0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
36bf0 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
36c00 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
36c10 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36c20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
36c30 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
36c40 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
36c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
36c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c70 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
36c80 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
36c90 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
36cb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
36cc0 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
36cd0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36cf0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36d00 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
36d10 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
36d20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36d30 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
36d40 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
36d50 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
36d60 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
36d70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
36d80 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
36d90 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
36da0 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
36db0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
36dc0 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
36dd0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
36de0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
36df0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
36e00 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
36e10 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
36e20 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
36e30 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
36e40 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
36e50 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
36e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
36e70 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
36e80 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
36e90 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
36ea0 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
36eb0 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
36ec0 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
36ed0 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
36ee0 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
36ef0 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
36f00 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
36f10 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
36f20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
36f30 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48   if( SQLITE_WITH
36f40 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70  IN(pCell,aData,p
36f50 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43  End) ){.      pC
36f60 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
36f70 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
36f80 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
36f90 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75  zCell[i];.    pu
36fa0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
36fb0 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29   (pData - aData)
36fc0 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
36fd0 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44  += 2;.    if( pD
36fe0 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29  ata < pCellptr )
36ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
37000 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
37010 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
37020 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
37030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
37040 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43  Cell[i]==pPg->xC
37050 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65  ellSize(pPg, pCe
37060 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
37070 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
37080 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50  e( szCell[i]!=pP
37090 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
370a0 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a  ,pCell) );.  }..
370b0 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46    /* The pPg->nF
370c0 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77  ree field is now
370d0 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
370e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
370f0 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70  l fix it. */.  p
37100 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  Pg->nCell = nCel
37110 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  l;.  pPg->nOverf
37120 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
37130 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
37140 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79  1], 0);.  put2by
37150 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
37160 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
37170 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
37180 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
37190 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61   aData);.  aData
371a0 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a  [hdr+7] = 0x00;.
371b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
371c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  OK;.}../*.** Arr
371d0 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
371e0 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
371f0 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
37200 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
37210 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  l.** contains th
37220 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
37230 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
37240 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
37250 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a   attempts to .**
37260 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73   add the cells s
37270 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72  tored in the arr
37280 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ay to page pPg. 
37290 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65  If it cannot (be
372a0 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
372b0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64  ge needs to be d
372c0 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
372d0 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c  re the cells wil
372e0 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f  l fit), non-zero
372f0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
37300 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
37310 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64  he cells are add
37320 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
37330 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75   zero is.** retu
37340 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rned..**.** Argu
37350 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f  ment pCellptr po
37360 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
37370 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
37380 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
37390 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61  y.** (part of pa
373a0 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c  ge pPg) to popul
373b0 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20  ate. After cell 
373c0 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69  apCell[0] is wri
373d0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70  tten to the.** p
373e0 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62  age body, a 16-b
373f0 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69  it offset is wri
37400 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72  tten to pCellptr
37410 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72  . And so on, for
37420 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e   each.** cell in
37430 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69   the array. It i
37440 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
37450 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
37460 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  er to ensure.** 
37470 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
37480 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69  to overwrite thi
37490 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65  s part of the ce
374a0 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
374b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
374c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
374d0 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f  lled, *ppData po
374e0 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
374f0 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  t of the .** con
37500 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67  tent area on pag
37510 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69  e pPg. If the si
37520 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ze of the conten
37530 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64  t area is extend
37540 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69  ed,.** *ppData i
37550 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  s updated to poi
37560 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
37570 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  art of the conte
37580 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72  nt area.** befor
37590 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
375a0 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75  ** Finally, argu
375b0 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e  ment pBegin poin
375c0 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  ts to the byte i
375d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
375e0 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20  wing the.** end 
375f0 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71  of the space req
37600 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61  uired by this pa
37610 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d  ge for the cell-
37620 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f  pointer area (fo
37630 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d  r.** all cells -
37640 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20   not just those 
37650 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20  inserted by the 
37660 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49  current call). I
37670 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
37680 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78   area must be ex
37690 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65  tended to before
376a0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
376b0 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61  rder to accomoda
376c0 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  te all.** cells 
376d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65  in apCell[], the
376e0 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e  n the cells do n
376f0 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a  ot fit and non-z
37700 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
37710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37720 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
37730 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37750 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64    /* Page to add
37760 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75   cells to */.  u
37770 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20  8 *pBegin,      
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37790 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f  * End of cell-po
377a0 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
377b0 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20   u8 **ppData,   
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377d0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65   /* IN/OUT: Page
377e0 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70   content -area p
377f0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
37800 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20  pCellptr,       
37810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37820 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70  ointer to cell-p
37830 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20  ointer area */. 
37840 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
37870 73 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a  st cell to add *
37880 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
378b0 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
378c0 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72   pPg */.  CellAr
378d0 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
378e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
378f0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29  ay of cells */.)
37900 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  {.  int i;.  u8 
37910 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44  *aData = pPg->aD
37920 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  ata;.  u8 *pData
37930 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e   = *ppData;.  in
37940 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20  t iEnd = iFirst 
37950 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  + nCell;.  asser
37960 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
37970 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d   pPg->hdrOffset=
37980 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65  =0 );    /* Neve
37990 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  r called on page
379a0 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46   1 */.  for(i=iF
379b0 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
379c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20  +){.    int sz, 
379d0 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  rc;.    u8 *pSlo
379e0 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68  t;.    sz = cach
379f0 65 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72  edCellSize(pCArr
37a00 61 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ay, i);.    if( 
37a10 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20  (aData[1]==0 && 
37a20 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20  aData[2]==0) || 
37a30 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e  (pSlot = pageFin
37a40 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63  dSlot(pPg,sz,&rc
37a50 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))==0 ){.      i
37a60 66 28 20 28 70 44 61 74 61 20 2d 20 70 42 65 67  f( (pData - pBeg
37a70 69 6e 29 3c 73 7a 20 29 20 72 65 74 75 72 6e 20  in)<sz ) return 
37a80 31 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  1;.      pData -
37a90 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 53 6c 6f  = sz;.      pSlo
37aa0 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
37ab0 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e  .    /* pSlot an
37ac0 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  d pCArray->apCel
37ad0 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20  l[i] will never 
37ae0 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c  overlap on a wel
37af0 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20  l-formed.    ** 
37b00 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74  database.  But t
37b10 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20  hey might for a 
37b20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
37b30 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d  .  Hence use mem
37b40 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69  move().    ** si
37b50 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e  nce memcpy() sen
37b60 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68  ds SIGABORT with
37b70 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66   overlapping buf
37b80 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20  fers on OpenBSD 
37b90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
37ba0 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72  pSlot+sz)<=pCArr
37bb0 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20  ay->apCell[i].  
37bc0 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e         || pSlot>
37bd0 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  =(pCArray->apCel
37be0 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20  l[i]+sz).       
37bf0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
37c00 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
37c10 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
37c20 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
37c30 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37c40 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
37c50 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37c60 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
37c70 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
37c80 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
37c90 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37ca0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37cb0 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37cc0 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37cd0 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
37ce0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
37cf0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
37d00 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
37d10 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
37d20 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
37d30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
37d40 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
37d50 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
37d60 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
37d70 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
37d80 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
37d90 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
37da0 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
37db0 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
37dc0 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
37dd0 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
37de0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
37df0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
37e00 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
37e10 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
37e20 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
37e30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
37e40 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
37e50 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
37e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37e70 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
37e80 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ea0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
37eb0 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
37ec0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ee0 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
37ef0 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
37f00 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
37f10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37f20 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
37f30 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
37f40 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
37f50 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
37f60 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
37f70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37f80 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
37f90 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
37fa0 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
37fb0 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
37fc0 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
37fd0 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
37fe0 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
37ff0 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
38000 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
38010 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
38020 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72  0;..  for(i=iFir
38030 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
38040 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
38050 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
38060 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51  l[i];.    if( SQ
38070 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c  LITE_WITHIN(pCel
38080 6c 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29  l, pStart, pEnd)
38090 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
380a0 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
380b0 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
380c0 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
380d0 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
380e0 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
380f0 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
38100 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
38110 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
38120 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
38130 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
38140 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
38150 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
38160 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c  = pCArray->szCel
38170 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73  l[i];  assert( s
38180 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  z>0 );.      if(
38190 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
381a0 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
381b0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
381c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
381d0 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
381e0 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
381f0 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
38200 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
38210 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
38220 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
38230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
38240 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
38250 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
38260 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
38270 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
38280 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
38290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
382a0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
382b0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
382c0 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
382d0 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
382e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
382f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38300 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
38310 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
38320 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
38330 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
38340 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
38350 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
38360 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
38370 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
38380 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
38390 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
383a0 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
383b0 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
383c0 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
383d0 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
383e0 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
383f0 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
38400 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
38410 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
38420 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
38430 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
38440 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
38450 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
38460 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
38470 77 5d 2e 0a 2a 2a 0a