/ Hex Artifact Content
Login

Artifact 388fd95a653004e9c6a8370a8a5dd9620f0d861a2231bf46d8563236444d74d2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79  x);.}../* Verify
3c80: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3c90: 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72 65   and the BtShare
3ca0: 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77 68  d agree about wh
3cb0: 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  at is the curren
3cc0: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
3cd0: 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  nnetion. This is
3ce0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73 68   important in sh
3cf0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
3d00: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
3d10: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
3d20: 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75 74  pointers get out
3d30: 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73 20  -of-sync, it is 
3d40: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f 75  possible for rou
3d50: 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62 74  tines like.** bt
3d60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f  reeInitPage() to
3d70: 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73 74   reference an st
3d80: 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ale connection p
3d90: 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66 65  ointer that refe
3da0: 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63 6f  rences a.** a co
3db0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
3dc0: 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64  s already closed
3dd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3de0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  is used inside a
3df0: 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
3e00: 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20 66  ments only and f
3e10: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
3e20: 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69 6e  f double-checkin
3e30: 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65 65  g that the btree
3e40: 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b 65   code.** does ke
3e50: 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ep the database 
3e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3e70: 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ers up-to-date..
3e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  */.static int cu
3e90: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
3ea0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
3eb0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3ec0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
3ed0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
3ee0: 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d  ree->db==p->pBt-
3ef0: 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >db);.}.#endif..
3f00: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3f10: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
3f20: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
3f30: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
3f40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3f50: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
3f60: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
3f70: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
3f80: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3f90: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
3fa0: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
3fb0: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
3fc0: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
3fd0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3fe0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3ff0: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
4000: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
4010: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
4020: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
4030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4040: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
4050: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
4060: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
4070: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
4080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
40a0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
40b0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
40c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
40d0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
40e0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
4110: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4120: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
4130: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
4140: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
4150: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
4160: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
4170: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
4180: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
4190: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
41a0: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
41b0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
41c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
41d0: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
41e0: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
41f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4200: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
4210: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
4220: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
4230: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
4240: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
4250: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
4260: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
4270: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
4280: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
4290: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
42a0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
42b0: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
42c0: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
42d0: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
42e0: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
42f0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
4300: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4310: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
4320: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
4330: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
4340: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4360: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4370: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
4380: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
4390: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
43a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
43b0: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ck */.  Pgno pgn
43c0: 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  oRoot,          
43d0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
43e0: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
43f0: 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ing */.  i64 iRo
4400: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4410: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4420: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4430: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4440: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
4450: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
4460: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
4470: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
4480: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
4490: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
44a0: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
44b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
44c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
44d0: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
44e0: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
44f0: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4500: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4510: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4520: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4530: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
4540: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
4550: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
4560: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4570: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
4580: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
4590: 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26 26 20  ot==pgnoRoot && 
45a0: 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c  (isClearTable ||
45b0: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
45c0: 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Row) ){.        
45d0: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
45e0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
45f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4600: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
4610: 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49   function when I
4620: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4630: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4640: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4650: 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c 79 2c  obCursors(w,x,y,
4660: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
4670: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4680: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
4690: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
46a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
46b0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
46c0: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
46d0: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
46e0: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
46f0: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
4700: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
4710: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
4720: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
4730: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4740: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
4750: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
4760: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
4770: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
4780: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
4790: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
47a0: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
47b0: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
47c0: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
47d0: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
47e0: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
47f0: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
4800: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
4810: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
4820: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
4830: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
4840: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
4850: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
4860: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4870: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
4880: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
4890: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
48a0: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
48b0: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
48c0: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
48d0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
48e0: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
48f0: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
4900: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
4910: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
4920: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4930: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
4940: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
4950: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
4960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4970: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4980: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
4990: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
49a0: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
49b0: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
49c0: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
49d0: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
49e0: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
49f0: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
4a00: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
4a10: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
4a20: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
4a30: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
4a40: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
4a50: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
4a60: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4a70: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
4a80: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
4a90: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
4aa0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
4ab0: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
4ac0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
4ad0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4ae0: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
4af0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4b00: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
4b10: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4b20: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
4b30: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4b40: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
4b50: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
4b60: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4b70: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
4b80: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
4b90: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
4ba0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
4bb0: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
4bc0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
4bd0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4be0: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
4bf0: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
4c00: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4c10: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4c20: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
4c30: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
4c40: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
4c50: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c60: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4c70: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
4c80: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
4c90: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
4ca0: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
4cb0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
4cc0: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
4cd0: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4ce0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
4cf0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4d00: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4d10: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4d20: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4d30: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4d40: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4d50: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4d60: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
4d70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4d80: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
4d90: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4da0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4db0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4dc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4dd0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4de0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4df0: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
4e00: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
4e10: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4e20: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
4e30: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
4e40: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4e50: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
4e60: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4e70: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
4e80: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4e90: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
4ea0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
4eb0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ec0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
4ed0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
4ee0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4ef0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4f00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4f10: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4f20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4f30: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4f50: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4f60: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4f70: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4f80: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
4f90: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
4fa0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
4fb0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
4fc0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
4fd0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
4fe0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4ff0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
5000: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
5010: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
5020: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
5030: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
5040: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
5050: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
5060: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
5070: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
5080: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
5090: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
50a0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
50b0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
50c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
50d0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
50e0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
50f0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
5100: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
5110: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
5120: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
5130: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
5140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5150: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
5160: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
5170: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
5180: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
5190: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
51a0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51b0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
51c0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
51d0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
51e0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
51f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5200: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5210: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
5220: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5230: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
5240: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
5250: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
5260: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
5270: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
5280: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
5290: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
52a0: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ge = -1;.}../*.*
52b0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
52c0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
52d0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
52e0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
52f0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
5300: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
5310: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
5320: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
5330: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5340: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5350: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5360: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5370: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5380: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5390: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
53a0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
53b0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
53c0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
53d0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
53e0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
53f0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
5400: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5410: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
5420: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
5430: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5440: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5450: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5460: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5470: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5480: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5490: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
54a0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
54b0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
54c0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
54d0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
54e0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
54f0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
5500: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
5510: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
5520: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5530: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5540: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5550: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5560: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5570: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5580: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5590: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
55a0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
55b0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
55c0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
55d0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
55e0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
55f0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
5600: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
5610: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
5620: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
5630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5640: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5650: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5660: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5670: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5680: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5690: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
56a0: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
56b0: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
56c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
56d0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
56e0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
56f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5700: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5710: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5720: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5730: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5740: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5750: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5760: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5780: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5790: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
57a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
57b0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
57c0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
57d0: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
57e0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
57f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5800: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5810: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5820: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5830: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5840: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5850: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5860: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5870: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5880: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5890: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
58a0: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
58b0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
58c0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
58d0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
58e0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
58f0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5900: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5910: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5920: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5930: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5940: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5950: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5960: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5970: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5980: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5990: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
59a0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
59b0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
59c0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
59d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
59e0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
59f0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5a00: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5a10: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5a20: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5a30: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5a40: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5a50: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5a60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5a70: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5a80: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5a90: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5aa0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5ab0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5ac0: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5ad0: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ae0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5af0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5b00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5b10: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5b20: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5b30: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5b40: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5b50: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5b60: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5b70: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5b80: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5b90: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5ba0: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5bb0: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5bc0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5bd0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5be0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5bf0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5c00: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5c10: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5c20: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5c30: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
5c40: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
5c50: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
5c60: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
5c70: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
5c80: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
5c90: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
5ca0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
5cb0: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
5cc0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
5cd0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
5ce0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
5cf0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
5d00: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
5d10: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
5d20: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
5d30: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
5d40: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
5d50: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
5d60: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
5d70: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
5d80: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5d90: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
5da0: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
5db0: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
5dc0: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
5dd0: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
5de0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
5df0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
5e00: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
5e10: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
5e20: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
5e30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
5e40: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
5e50: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
5e60: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
5e70: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
5e80: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
5e90: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
5ea0: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
5eb0: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
5ec0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
5ed0: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
5ee0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
5ef0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5f00: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
5f10: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
5f20: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
5f30: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
5f40: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
5f50: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
5f60: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5f70: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
5f80: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
5f90: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
5fa0: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
5fb0: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
5fc0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
5fd0: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
5fe0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
5ff0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
6000: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
6010: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6020: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6030: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6040: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6050: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6060: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6070: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6080: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6090: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
60a0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
60b0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
60c0: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
60d0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
60e0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
60f0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
6100: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
6110: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
6120: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
6130: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6160: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6180: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6190: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
61a0: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
61b0: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
61c0: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
61d0: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
61e0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
61f0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
6200: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
6210: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
6220: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
6230: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6240: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6250: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6260: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6270: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6280: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6290: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
62a0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
62b0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
62d0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
62e0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
62f0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
6300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
6310: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
6320: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
6330: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6340: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6350: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6360: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6370: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6380: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6390: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
63a0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
63b0: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
63c0: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
63d0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
63e0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
63f0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
6400: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
6410: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6420: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
6430: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6440: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6450: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6460: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6470: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6480: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
6490: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
64a0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
64b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
64c0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
64d0: 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
64e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
64f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6500: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
6510: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
6520: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6530: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
6540: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
6550: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
6560: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6570: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
6580: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
6590: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
65a0: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
65b0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
65c0: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
65d0: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
65e0: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
65f0: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
6600: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
6610: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
6620: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
6630: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
6640: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
6650: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
6660: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
6670: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
6680: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
6690: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
66a0: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
66b0: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
66c0: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
66d0: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
66e0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
66f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
6700: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
6710: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
6720: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
6730: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
6740: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
6750: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
6760: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
6770: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
6780: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
6790: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
67a0: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
67b0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
67c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
67d0: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
67e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
67f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
6800: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
6810: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
6820: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
6830: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
6840: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
6850: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6860: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6870: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6880: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6890: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
68a0: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
68b0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29  (pCur->pKeyInfo)
68c0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
68d0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
68e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
68f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6900: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
6910: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
6920: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
6930: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6940: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6960: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6970: 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50 61 67  PGNO(pCur->apPag
6980: 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
6990: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  pgno);.      got
69a0: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
69b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
69c0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
69d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
69e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
69f0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6a00: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6a10: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6a20: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6a30: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6a40: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6a50: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6a60: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6a70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6a80: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6a90: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6aa0: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6ab0: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6ac0: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6ad0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6ae0: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6af0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6b00: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6b10: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6b20: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6b30: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6b40: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6b50: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6b60: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6b70: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6b80: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6b90: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6ba0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6bb0: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6bc0: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6bd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6be0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6bf0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6c00: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6c10: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6c20: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6c30: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6c40: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6c50: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
6c60: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
6c70: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
6c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
6c90: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
6ca0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6cb0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6cc0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
6cd0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
6ce0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
6cf0: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
6d00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6d20: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6d30: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6d40: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6d50: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6d60: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6d70: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6d80: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6d90: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
6da0: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
6db0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
6dc0: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6dd0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6de0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
6df0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6e00: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
6e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6e20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
6e30: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6e40: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6e50: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6e60: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6e70: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6e80: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6e90: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6ea0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6eb0: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6ec0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6ed0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
6ee0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
6ef0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
6f00: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
6f10: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
6f20: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
6f30: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6f40: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6f50: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6f60: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6f70: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6f80: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6f90: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6fa0: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6fb0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6fc0: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6fd0: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
6fe0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
6ff0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
7000: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
7010: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
7020: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
7030: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
7040: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
7050: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7060: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7070: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7080: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7090: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
70a0: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
70b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
70c0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
70d0: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
70e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
70f0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7100: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
7110: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7120: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
7130: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
7140: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
7150: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
7160: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
7170: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
7180: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
7190: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
71a0: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
71b0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
71c0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
71d0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
71e0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
71f0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7200: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
7210: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
7220: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
7230: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
7240: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
7250: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
7260: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
7270: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
7280: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
7290: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
72a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
72b0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
72c0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
72d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
72e0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
72f0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
7300: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
7310: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
7320: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7330: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
7340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7350: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
7360: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7370: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
7380: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
7390: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
73a0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
73b0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
73c0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
73d0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
73e0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
73f0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
7400: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7410: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
7420: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
7430: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
7440: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7450: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
7460: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
7470: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
7480: 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  kipNext==0 );.  
7490: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
74a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
74b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
74c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
74d0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
74e0: 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  TS./*.** Provide
74f0: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7500: 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69  rsor.  The parti
7510: 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e  cular hint given
7520: 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a   (and the type.*
7530: 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  * and number of 
7540: 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61  the varargs para
7550: 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72  meters) is deter
7560: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69  mined by the eHi
7570: 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65  ntType.** parame
7580: 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65  ter.  See the de
7590: 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  finitions of the
75a0: 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61   BTREE_HINT_* ma
75b0: 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73  cros for details
75c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
75d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
75e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
75f0: 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20   int eHintType, 
7600: 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20  ...){.  /* Used 
7610: 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74  only by system t
7620: 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74  hat substitute t
7630: 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65  heir own storage
7640: 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e   engine */.}.#en
7650: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  dif../*.** Provi
7660: 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f  de flag hints to
7670: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
7680: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
7690: 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73  eCursorHintFlags
76a0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
76b0: 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20   unsigned x){.  
76c0: 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45  assert( x==BTREE
76d0: 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42  _SEEK_EQ || x==B
76e0: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c  TREE_BULKLOAD ||
76f0: 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d   x==0 );.  pCur-
7700: 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a  >hints = x;.}...
7710: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7720: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
7730: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
7740: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
7750: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
7760: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
7770: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
7780: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
7790: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
77a0: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
77b0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
77c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
77d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f  .** Return 0 (no
77e0: 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20  t a valid page) 
77f0: 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63  for pgno==1 sinc
7800: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  e there is.** no
7810: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73   pointer map ass
7820: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
7830: 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72  e 1.  The integr
7840: 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a  ity_check logic.
7850: 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ** requires that
7860: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c   ptrmapPageno(*,
7870: 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  1)!=1..*/.static
7880: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
7890: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
78a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
78b0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
78c0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
78d0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
78e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
78f0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7900: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
7910: 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o<2 ) return 0;.
7920: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
7930: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
7940: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
7950: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
7960: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
7970: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
7980: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
7990: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
79a0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
79b0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
79c0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
79d0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
79e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
79f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
7a00: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7a10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
7a20: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
7a30: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
7a40: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
7a50: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
7a60: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
7a70: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
7a80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
7a90: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
7aa0: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
7ab0: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
7ac0: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
7ad0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
7ae0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
7af0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7b00: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
7b10: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
7b20: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
7b30: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
7b40: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
7b50: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7b60: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
7b70: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
7b80: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
7b90: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
7ba0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
7bb0: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
7bc0: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
7bd0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
7be0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
7bf0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
7c00: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7c10: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
7c20: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
7c30: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
7c40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7c50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
7c60: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7c70: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
7c80: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
7c90: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
7ca0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7cb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7cc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
7cd0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
7ce0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
7cf0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
7d00: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
7d10: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
7d20: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
7d30: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
7d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7d50: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
7d60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
7d70: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
7d80: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7d90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7da0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
7db0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
7dc0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
7dd0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
7de0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
7df0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
7e00: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
7e10: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
7e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
7e30: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
7e40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
7e50: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7e60: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7e70: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
7e80: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
7e90: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7ea0: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
7eb0: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
7ec0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7ed0: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7ee0: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
7ef0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
7f00: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
7f10: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
7f20: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
7f30: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
7f40: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
7f50: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
7f60: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
7f70: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
7f80: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
7f90: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
7fa0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
7fb0: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
7fc0: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
7fd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
7fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ff0: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
8000: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
8010: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
8020: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
8030: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
8040: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
8050: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8060: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
8070: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
8080: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
8090: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
80a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
80b0: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
80c0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
80d0: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
80e0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
80f0: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
8100: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
8110: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
8120: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
8130: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
8140: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
8150: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
8160: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
8170: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
8180: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
8190: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
81a0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
81b0: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
81c0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
81d0: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
81e0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
81f0: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
8200: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8210: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
8220: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
8230: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
8240: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
8250: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
8260: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
8270: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
8280: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
8290: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
82a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
82b0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
82c0: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
82d0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
82e0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
8300: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
8310: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
8320: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
8330: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
8340: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
8350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
8360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
8370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
8380: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
8390: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
83a0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
83b0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
83c0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
83d0: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
83e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
83f0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
8400: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
8410: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
8420: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
8430: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
8440: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
8450: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
8460: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
8470: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
8480: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
8490: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
84a0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
84b0: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
84c0: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
84d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
84e0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72  ORRUPT_PGNO(iPtr
84f0: 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  map);.  return S
8500: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
8510: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
8520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8530: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
8540: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
8550: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8560: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8570: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8580: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
8590: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
85a0: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
85b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
85c0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
85d0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
85e0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
85f0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
8600: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
8610: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
8620: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
8630: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8640: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
8650: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8660: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8670: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8680: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
8690: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
86a0: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
86b0: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
86c0: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
86d0: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
86e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
86f0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
8700: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
8710: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
8720: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
8730: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
8740: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
8750: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8760: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8770: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8780: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
8790: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
87a0: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
87b0: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
87c0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
87d0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
87e0: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
87f0: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
8800: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
8810: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
8820: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
8830: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
8840: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
8850: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8860: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8870: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8880: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
8890: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
88a0: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
88b0: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
88c0: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
88d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
88e0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
88f0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
8900: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
8910: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
8920: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8930: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8940: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8950: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8960: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8980: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8990: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
89a0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
89b0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
89c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
89d0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
89e0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
89f0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
8a00: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
8a10: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
8a20: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
8a30: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
8a40: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
8a50: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8a60: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8a70: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8a80: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8a90: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8aa0: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8ab0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8ac0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8ad0: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8ae0: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8af0: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8b00: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
8b10: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
8b20: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
8b30: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
8b40: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
8b50: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8b60: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8b70: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8b80: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8b90: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8ba0: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8bb0: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8bc0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8bd0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8be0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8bf0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8c00: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8c10: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8c20: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8c30: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8c40: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8c50: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8c60: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8c70: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8c80: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8c90: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8ca0: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8cb0: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8cc0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8cd0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8ce0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8cf0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8d00: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8d10: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8d20: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8d30: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8d40: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8d50: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8d60: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8d70: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8d80: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8d90: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8da0: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8db0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8dc0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8dd0: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8de0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8df0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8e00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8e10: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8e20: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8e30: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8e40: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8e50: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8e60: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8e70: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8e80: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e90: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8ea0: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8eb0: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8ec0: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8ed0: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8ee0: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8ef0: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8f00: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8f10: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8f20: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8f30: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8f40: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8f50: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8f60: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8f70: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8f80: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8f90: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8fa0: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8fb0: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8fc0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8fd0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8fe0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
8ff0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9000: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9010: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9020: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9030: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9040: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9050: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9060: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9070: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9080: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9090: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
90a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
90b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
90c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
90d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90e0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
90f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9100: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
9110: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9120: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
9130: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
9140: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
9150: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9160: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9170: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9180: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9190: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
91a0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
91b0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
91c0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
91d0: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
91e0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
91f0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
9200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
92a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
92d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
92e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
92f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
9320: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
9330: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9340: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
9350: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9360: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9370: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9380: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9390: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
93a0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
93b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
93c0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
93d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
93e0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
93f0: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9400: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
9410: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9420: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
9430: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
9440: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
9450: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9460: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9470: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9480: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9490: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
94a0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
94b0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
94c0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
94d0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
94e0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
94f0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
9500: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9510: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
9520: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
9530: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9540: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
9550: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9560: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9570: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9580: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9590: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
95a0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
95b0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
95c0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
95d0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
95e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
95f0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9600: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9610: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9620: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
9630: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
9640: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
9650: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9660: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9670: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9680: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
9690: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
96a0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
96b0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
96c0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
96d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
96e0: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
96f0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
9700: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
9710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9720: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9730: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
9740: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
9750: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9760: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9770: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9780: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9790: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
97a0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
97b0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
97c0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
97d0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
97e0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
97f0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9800: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9810: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9820: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9830: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9840: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9850: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9860: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9870: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9880: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9890: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
98a0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
98b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
98c0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
98d0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
98e0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
98f0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9900: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9910: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9920: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9930: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9940: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9950: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9960: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9970: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9980: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9990: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
99a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
99b0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
99c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
99d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
99e0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
99f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9a00: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9a10: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9a20: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9a30: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9a40: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9a50: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9a60: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9a70: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9a90: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9aa0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9ab0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9ac0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9ad0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9ae0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9af0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9b00: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
9b10: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
9b20: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
9b30: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
9b40: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
9b50: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9b60: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9b70: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9b80: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9b90: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9ba0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9bb0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9bc0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9bd0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9be0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9bf0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9c00: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9c10: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9c20: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9c30: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9c40: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9c50: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9c60: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9c70: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9c80: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9c90: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9ca0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9cb0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9cc0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9cd0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9ce0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9cf0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9d00: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9d10: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9d20: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9d30: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9d40: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9d50: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9d60: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9d70: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9d80: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9d90: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9da0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9db0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9dc0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9dd0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9de0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9e00: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9e10: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9e20: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9e30: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9e40: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9e50: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9e60: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9e70: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9e80: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9e90: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9eb0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9ec0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9ed0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9ee0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9ef0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9f00: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9f10: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9f20: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9f30: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9f40: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9f50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9f60: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9f70: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9f80: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9f90: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9fa0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9fb0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9fc0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9fd0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9fe0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9ff0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
a000: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
a010: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
a020: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
a030: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
a040: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
a050: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
a060: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
a070: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
a080: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
a090: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
a0a0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
a0b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
a0c0: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
a0d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
a0e0: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
a0f0: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
a100: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
a110: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
a120: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
a130: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a140: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a150: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a160: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a170: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a180: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a190: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a1a0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a1d0: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a1e0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a210: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a220: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a230: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a240: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a250: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a260: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a270: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a280: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a290: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a2a0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a2b0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a2c0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a2d0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a2e0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a2f0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a300: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a310: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a320: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a330: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a340: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a350: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a360: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a370: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a380: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a390: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a3a0: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a3b0: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a3c0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a3d0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a3e0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a3f0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a400: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a410: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a420: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a430: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a440: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a450: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a460: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a470: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a480: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a490: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a4a0: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a4b0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a4c0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a4d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a4e0: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a4f0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a500: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a510: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a520: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a530: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a540: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a550: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a560: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a570: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a580: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a590: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a5a0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a5b0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a5c0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a5d0: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a5e0: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a5f0: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a600: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a610: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a620: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a630: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a640: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a650: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a660: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a670: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a680: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a690: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a6a0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a6b0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a6c0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a6d0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a6e0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a6f0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a700: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a710: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a720: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a730: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a740: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a750: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a760: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a770: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a780: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a790: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a7a0: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a7b0: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a7c0: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a7d0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a7e0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a7f0: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a800: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a810: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a820: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a830: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a840: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a850: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a860: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a870: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a880: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a890: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a8a0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a8b0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a8c0: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a8d0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a8e0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a8f0: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a900: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a910: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a920: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a930: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a940: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a950: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a960: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a970: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a980: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a990: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a9a0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a9b0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a9c0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a9d0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a9e0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
a9f0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa00: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
aa10: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
aa20: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
aa30: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
aa40: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
aa50: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
aa60: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
aa70: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
aa80: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
aa90: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
aaa0: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
aab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
aac0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
aad0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
aae0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
aaf0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
ab00: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
ab10: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
ab20: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
ab30: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
ab40: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
ab50: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
ab60: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
ab70: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
ab80: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ab90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aba0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
abb0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
abc0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
abd0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
abe0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
abf0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
ac00: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
ac10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
ac20: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
ac30: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
ac40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
ac50: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ac60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ac70: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ac80: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
ac90: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
aca0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
acb0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
acc0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
acd0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
ace0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
acf0: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
ad00: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
ad10: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
ad20: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
ad30: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
ad40: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
ad50: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ad60: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ad70: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ad80: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ad90: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ada0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
adb0: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
adc0: 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73  eorganizes cells
add0: 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70   within the.** p
ade0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
adf0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c  e are no free-bl
ae00: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ocks on the free
ae10: 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a  -block list..**.
ae20: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61  ** Parameter nMa
ae30: 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78  xFrag is the max
ae40: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66  imum amount of f
ae50: 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
ae60: 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70  that may be.** p
ae70: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61  resent in the pa
ae80: 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ge after this ro
ae90: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
aea0: 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46  *.** EVIDENCE-OF
aeb0: 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20  : R-44582-60138 
aec0: 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20  SQLite may from 
aed0: 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f  time to time reo
aee0: 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74  rganize a.** b-t
aef0: 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74  ree page so that
af00: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
af10: 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67  eeblocks or frag
af20: 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a  ment bytes, all.
af30: 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  ** unused bytes 
af40: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
af50: 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64   the unallocated
af60: 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61   space region, a
af70: 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  nd all.** cells 
af80: 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74  are packed tight
af90: 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ly at the end of
afa0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
afb0: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
afc0: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
afd0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78  *pPage, int nMax
afe0: 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Frag){.  int i; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b010: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b040: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
b050: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b080: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b090: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0b0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
b0c0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
b0d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
b0e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
b0f0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
b100: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
b110: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
b120: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
b130: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b140: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
b150: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
b160: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b170: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
b180: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
b190: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
b1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b1b0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
b1c0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
b1d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
b1e0: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
b1f0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
b200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
b210: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
b220: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
b230: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
b240: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
b250: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
b260: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b270: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b290: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b2a0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b2b0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b2d0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b2e0: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73   index */..  ass
b2f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b300: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
b310: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b320: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b330: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b340: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
b350: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
b360: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
b370: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
b380: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b390: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
b3a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b3b0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b3c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
b3d0: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
b3e0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b3f0: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
b400: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b410: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
b420: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
b430: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
b440: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
b450: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
b460: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
b470: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
b480: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b490: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
b4a0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
b4b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
b4c0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
b4d0: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
b4e0: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
b4f0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
b500: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
b510: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
b520: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
b530: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
b540: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
b550: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
b560: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
b570: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
b580: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
b590: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
b5a0: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
b5b0: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
b5c0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
b5d0: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
b5e0: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
b5f0: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
b600: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
b610: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
b620: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
b630: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
b640: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
b650: 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20    if( iFree ){. 
b660: 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20       int iFree2 
b670: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b680: 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20  [iFree]);..     
b690: 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74   /* pageFindSlot
b6a0: 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76  () has already v
b6b0: 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65  erified that fre
b6c0: 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72  e blocks are sor
b6d0: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ted.      ** in 
b6e0: 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20  order of offset 
b6f0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
b700: 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f   and that no blo
b710: 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20  ck extends.     
b720: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
b730: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72   of the page. Pr
b740: 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66  ovided the two f
b750: 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74  ree slots do not
b760: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c   .      ** overl
b770: 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74  ap, this guarant
b780: 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d  ees that the mem
b790: 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c  move() calls bel
b7a0: 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
b7b0: 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74    ** overwrite t
b7c0: 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79  he usableSize by
b7d0: 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20  te buffer, even 
b7e0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
b7f0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
b800: 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
b810: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b820: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e  e2==0 || iFree2>
b830: 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61  iFree );.      a
b840: 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74  ssert( iFree+get
b850: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b860: 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+2]) <= usableS
b870: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
b880: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
b890: 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74  | iFree2+get2byt
b8a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
b8b0: 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  ]) <= usableSize
b8c0: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
b8d0: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
b8e0: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
b8f0: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
b900: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
b910: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
b920: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
b930: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
b940: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
b950: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
b960: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
b970: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b980: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
b990: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
b9a0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b9b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b9c0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
b9d0: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
b9e0: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
b9f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ba00: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
ba10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  ;.          sz2 
ba20: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ba30: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
ba40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
ba50: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
ba60: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
ba70: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
ba80: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
ba90: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
baa0: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
bab0: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
bac0: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
bad0: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
bae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
baf0: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
bb00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bb10: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
bb20: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
bb30: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
bb40: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
bb50: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
bb60: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
bb70: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
bb80: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
bb90: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
bba0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
bbb0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
bbc0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
bbd0: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
bbe0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
bbf0: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
bc00: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
bc10: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
bc20: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
bc30: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
bc40: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
bc50: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
bc60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
bc70: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
bc80: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
bc90: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
bca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
bcb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
bcc0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
bcd0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
bce0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
bcf0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
bd00: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
bd10: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
bd20: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
bd30: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
bd40: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
bd50: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
bd60: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
bd70: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
bd80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
bd90: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
bda0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
bdb0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
bdc0: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
bdd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bde0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
bdf0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
be00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
be10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
be20: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
be30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
be40: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
be50: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
be60: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
be70: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
be80: 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  e(pPage, &src[pc
be90: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
bea0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
beb0: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
bec0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
bed0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
bee0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bef0: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
bf00: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gno);.    }.    
bf10: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
bf20: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
bf30: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
bf40: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
bf50: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
bf60: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
bf70: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
bf80: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
bf90: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
bfa0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20  ddr, cbrk);.    
bfb0: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20  if( temp==0 ){. 
bfc0: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
bfd0: 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29    if( cbrk==pc )
bfe0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
bff0: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
c000: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
c010: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
c020: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  );.      x = get
c030: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c040: 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  5]);.      memcp
c050: 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74  y(&temp[x], &dat
c060: 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65  a[x], (cbrk+size
c070: 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72  ) - x);.      sr
c080: 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a  c = temp;.    }.
c090: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
c0a0: 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d  [cbrk], &src[pc]
c0b0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64  , size);.  }.  d
c0c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
c0d0: 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  . defragment_out
c0e0: 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  :.  if( data[hdr
c0f0: 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69  +7]+cbrk-iCellFi
c100: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
c110: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
c120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c130: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
c140: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
c150: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c160: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
c170: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
c180: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
c190: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
c1a0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  r+2] = 0;.  mems
c1b0: 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69  et(&data[iCellFi
c1c0: 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43  rst], 0, cbrk-iC
c1d0: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73  ellFirst);.  ass
c1e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c1f0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
c200: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
c210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c220: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  OK;.}../*.** Sea
c230: 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rch the free-lis
c240: 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f  t on page pPg fo
c250: 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  r space to store
c260: 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79   a cell nByte by
c270: 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20  tes in.** size. 
c280: 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f  If one can be fo
c290: 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  und, return a po
c2a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61  inter to the spa
c2b0: 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  ce and remove it
c2c0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65  .** from the fre
c2d0: 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e-list..**.** If
c2e0: 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61   no suitable spa
c2f0: 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  ce can be found 
c300: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
c310: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
c320: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c330: 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f  on may detect co
c340: 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20  rruption within 
c350: 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74  pPg.  If corrupt
c360: 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74  ion is.** detect
c370: 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20  ed then *pRc is 
c380: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f  set to SQLITE_CO
c390: 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69  RRUPT and NULL i
c3a0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
c3b0: 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66  * Slots on the f
c3c0: 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61 72  ree list that ar
c3d0: 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
c3e0: 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20 74  3 bytes larger t
c3f0: 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c  han nByte.** wil
c400: 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20  l be ignored if 
c410: 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72 61  adding the extra
c420: 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66 72   space to the fr
c430: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
c440: 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20  t.** causes the 
c450: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
c460: 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36 30  unt to exceed 60
c470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
c480: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d  pageFindSlot(Mem
c490: 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e  Page *pPg, int n
c4a0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b  Byte, int *pRc){
c4b0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4c0: 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
c4d0: 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  t;.  u8 * const 
c4e0: 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
c4f0: 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20  ta;.  int iAddr 
c500: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74  = hdr + 1;.  int
c510: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c520: 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20  aData[iAddr]);. 
c530: 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73   int x;.  int us
c540: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
c550: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c560: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30  ..  assert( pc>0
c570: 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e   );.  do{.    in
c580: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
c590: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c5a0: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
c5b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
c5c0: 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35  F: R-06866-39125
c5d0: 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   Freeblocks are 
c5e0: 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64  always connected
c5f0: 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20   in order of.   
c600: 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f   ** increasing o
c610: 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ffset. */.    if
c620: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
c630: 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20  4 || pc<iAddr+4 
c640: 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
c650: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c660: 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  GNO(pPg->pgno);.
c670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c680: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
c690: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31  DENCE-OF: R-2271
c6a0: 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72  0-53328 The thir
c6b0: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74  d and fourth byt
c6c0: 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a  es of each.    *
c6d0: 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d  * freeblock form
c6e0: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
c6f0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c700: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
c710: 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  reeblock.    ** 
c720: 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64  in bytes, includ
c730: 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68  ing the 4-byte h
c740: 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69  eader. */.    si
c750: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ze = get2byte(&a
c760: 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  Data[pc+2]);.   
c770: 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d   if( (x = size -
c780: 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20   nByte)>=0 ){.  
c790: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
c7a0: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
c7b0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
c7c0: 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67      if( pc < pPg
c7d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
c7e0: 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a  Pg->nCell || siz
c7f0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
c800: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  e ){.        *pR
c810: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c820: 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70 67 6e  PT_PGNO(pPg->pgn
c830: 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
c840: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
c850: 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20  e if( x<4 ){.   
c860: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
c870: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
c880: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
c890: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
c8a0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
c8b0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
c8c0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
c8d0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
c8e0: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
c8f0: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
c900: 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b  ]>57 ) return 0;
c910: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ..        /* Rem
c920: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
c930: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
c940: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
c950: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
c960: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
c970: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
c980: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
c990: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
c9a0: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
c9b0: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
c9c0: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
c9d0: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
c9e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c9f0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
ca00: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
ca10: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
ca20: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
ca30: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
ca40: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
ca50: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
ca60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
ca70: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
ca80: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
ca90: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
caa0: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
cab0: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
cac0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
cad0: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
cae0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b  .  }while( pc );
caf0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
cb00: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
cb10: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
cb20: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
cb30: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
cb40: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
cb50: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
cb60: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
cb70: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
cb80: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
cb90: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
cba0: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
cbb0: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
cbc0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
cbd0: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
cbe0: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
cbf0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
cc00: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
cc10: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
cc20: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
cc30: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
cc40: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
cc50: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
cc60: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
cc70: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
cc80: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
cc90: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
cca0: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ccb0: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ccc0: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ccd0: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
cce0: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ccf0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
cd00: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
cd10: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
cd20: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
cd30: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
cd40: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
cd50: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
cd60: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
cd70: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
cd80: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
cd90: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
cda0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
cdb0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
cdc0: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
cdd0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
cde0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
cdf0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ce00: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ce10: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
ce20: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
ce30: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
ce40: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
ce50: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
ce60: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ce90: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
cea0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
ceb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cec0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ced0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
cee0: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
cef0: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
cf00: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
cf10: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
cf20: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
cf30: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
cf40: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
cf50: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
cf60: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
cf70: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
cf80: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
cf90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cfa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cfb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cfc0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
cfd0: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
cfe0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
cff0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d000: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
d010: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
d020: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
d030: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
d040: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
d050: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
d060: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
d070: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
d080: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
d090: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
d0a0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
d0b0: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
d0c0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
d0d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
d0e0: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
d0f0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
d100: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
d110: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d120: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
d130: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
d140: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
d150: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
d160: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
d170: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
d180: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
d190: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
d1a0: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
d1b0: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
d1c0: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
d1d0: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
d1e0: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
d1f0: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
d200: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
d210: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
d220: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
d230: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
d240: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
d250: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
d260: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
d270: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
d280: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
d290: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
d2a0: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
d2b0: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
d2c0: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
d2d0: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
d2e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d2f0: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
d300: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
d310: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
d320: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d330: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
d340: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
d350: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
d360: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
d370: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
d380: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
d390: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
d3a0: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
d3b0: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
d3c0: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
d3d0: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
d3e0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
d3f0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
d400: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
d410: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
d420: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
d430: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
d440: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
d450: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
d460: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
d470: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
d480: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
d490: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
d4a0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
d4b0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
d4c0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
d4d0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
d4e0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
d4f0: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
d500: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d510: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
d520: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
d530: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
d540: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
d550: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
d560: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d570: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
d580: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
d590: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d5a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
d5b0: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
d5c0: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
d5d0: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
d5e0: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
d5f0: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
d600: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
d610: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
d620: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
d630: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
d640: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
d650: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
d660: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
d670: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
d680: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
d690: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
d6a0: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
d6b0: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
d6c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
d6d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d6e0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
d6f0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
d700: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
d710: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
d720: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
d730: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
d740: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
d750: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
d760: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
d770: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
d780: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
d790: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
d7a0: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
d7b0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
d7c0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
d7d0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
d7e0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
d7f0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
d800: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
d810: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
d820: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
d830: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
d840: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
d850: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
d860: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
d870: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
d880: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
d890: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
d8a0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
d8b0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
d8c0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
d8d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d8e0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
d8f0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
d900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d910: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
d920: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
d930: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
d940: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
d950: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
d960: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
d970: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
d980: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
d990: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
d9a0: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
d9b0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
d9c0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
d9d0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
d9e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
d9f0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
da00: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
da10: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
da20: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
da30: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
da40: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
da50: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
da60: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
da70: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
da80: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
da90: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
daa0: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
dab0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
dac0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
dad0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
dae0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
daf0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
db00: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
db10: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
db20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
db30: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
db40: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
db50: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
db60: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
db70: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
db80: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
db90: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
dbc0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
dbd0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
dbe0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dc10: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
dc20: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc50: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
dc60: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
dc70: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
dca0: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
dcb0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
dcc0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
dcd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dce0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
dcf0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
dd00: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
dd10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dd20: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
dd30: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
dd40: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
dd50: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
dd60: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
dd80: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
dd90: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
dda0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
ddb0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
ddc0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
ddd0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
dde0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ddf0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
de00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
de10: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
de20: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
de30: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
de40: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
de50: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
de60: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
de70: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
de80: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
de90: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
dea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
deb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dec0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ded0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
dee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
def0: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
df00: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
df10: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
df20: 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20  ( iStart<=iLast 
df30: 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  );..  /* Overwri
df40: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
df50: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
df60: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
df70: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70  e_delete.  ** op
df80: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
df90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
dfa0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
dfb0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
dfc0: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
dfd0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
dfe0: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , iSize);.  }.. 
dff0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e000: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e010: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e020: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e030: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e040: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e050: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e060: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e070: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e080: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e090: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e0a0: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e0b0: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e0c0: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e0d0: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e0e0: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e0f0: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e100: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e110: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e120: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e130: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e140: 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20  r]))<iStart ){. 
e150: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
e160: 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20  k<iPtr+4 ){.    
e170: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e180: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e190: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e1a0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
e1b0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
e1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72      }.      iPtr
e1d0: 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20   = iFreeBlk;.   
e1e0: 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65   }.    if( iFree
e1f0: 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75  Blk>iLast ) retu
e200: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e210: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
e220: 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
e230: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
e240: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
e250: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
e260: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
e270: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
e280: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
e290: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
e2a0: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
e2b0: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
e2c0: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
e2d0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
e2e0: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
e2f0: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
e300: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
e310: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
e320: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
e330: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
e340: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
e350: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
e360: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
e370: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
e380: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
e390: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
e3a0: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
e3b0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
e3c0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
e3d0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
e3e0: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
e3f0: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
e400: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
e410: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
e420: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
e430: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e440: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
e450: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
e460: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
e470: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
e480: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
e490: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
e4a0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
e4b0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
e4c0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
e4d0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
e4e0: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
e4f0: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
e500: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
e510: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
e520: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
e530: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
e540: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
e550: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
e560: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
e570: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e580: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
e590: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
e5a0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
e5b0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
e5c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
e5d0: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
e5e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
e5f0: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
e600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e610: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e620: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
e630: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
e640: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
e650: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
e660: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
e670: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
e680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e690: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
e6a0: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
e6b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e6c0: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
e6d0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
e6e0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
e6f0: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
e700: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e710: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
e720: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
e730: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
e740: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
e750: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
e760: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
e770: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
e780: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
e790: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
e7a0: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
e7b0: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
e7c0: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
e7d0: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
e7e0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
e7f0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
e800: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e810: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
e820: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
e830: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
e840: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
e850: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
e860: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
e870: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
e880: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
e890: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
e8a0: 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62  tart);.    put2b
e8b0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
e8c0: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
e8d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e8e0: 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
e8f0: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
e900: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
e910: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
e920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e930: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
e940: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
e950: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
e960: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
e970: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
e980: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
e990: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
e9a0: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
e9b0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
e9c0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
e9d0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
e9e0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
e9f0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
ea00: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
ea10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
ea20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
ea30: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
ea40: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ea50: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
ea60: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
ea70: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
ea80: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
ea90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eaa0: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
eab0: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
eac0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ead0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
eae0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
eaf0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
eb00: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
eb10: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
eb20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
eb30: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
eb40: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
eb50: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
eb60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
eb70: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
eb80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
eb90: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
eba0: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
ebb0: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
ebc0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
ebd0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
ebe0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
ebf0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
ec00: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
ec10: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
ec20: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
ec30: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ec40: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
ec50: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
ec60: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
ec70: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ec80: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
ec90: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
eca0: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
ecb0: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
ecc0: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
ecd0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
ece0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
ecf0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
ed00: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
ed10: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ed20: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
ed30: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
ed40: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
ed50: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
ed60: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
ed70: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
ed80: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
ed90: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
eda0: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
edb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
edc0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
edd0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
ede0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
edf0: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
ee00: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
ee10: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
ee20: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
ee30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
ee40: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
ee50: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
ee60: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
ee70: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
ee80: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
ee90: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
eea0: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
eeb0: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
eec0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
eed0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
eee0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
eef0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
ef00: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
ef10: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
ef20: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
ef50: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
ef60: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
ef70: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
ef80: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
ef90: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
efa0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
efb0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
efc0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
efd0: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
efe0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
eff0: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
f000: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f010: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
f020: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f030: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f040: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
f050: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
f060: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
f070: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f080: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
f090: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f0a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f0b0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
f0c0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f0d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
f0e0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f0f0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
f100: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f110: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f120: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
f130: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
f140: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f150: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
f160: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
f170: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f180: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
f190: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70  ->pgno);.  }.  p
f1a0: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
f1b0: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
f1c0: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
f1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f1e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
f1f0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
f200: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
f210: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
f220: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f230: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f240: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f250: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f260: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f270: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f280: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f290: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f2a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f2b0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f2c0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f2d0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f2e0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f2f0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f300: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f310: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f320: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f330: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f350: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f360: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
f370: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
f380: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
f390: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
f3a0: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
f3b0: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f3d0: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f3e0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f3f0: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
f400: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f410: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f420: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
f430: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
f440: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
f450: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
f460: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
f470: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
f480: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
f490: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63   page */.  u16 c
f4a0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
f4b0: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
f4c0: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
f4d0: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
f4e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
f4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f500: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
f510: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
f520: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
f530: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
f540: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
f550: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
f560: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
f570: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
f580: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
f590: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
f5a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
f5b0: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
f5c0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
f5d0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
f5e0: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
f5f0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
f600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f610: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
f620: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f630: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f640: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f650: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
f660: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
f670: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
f680: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
f690: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
f6a0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
f6b0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
f6c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
f6d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f6e0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
f6f0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f700: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
f710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f720: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  e->isInit==0 );.
f730: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
f740: 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  pBt;.  hdr = pPa
f750: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
f760: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
f770: 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Data;.  /* EVIDE
f780: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
f790: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
f7a0: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
f7b0: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
f7c0: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
f7d0: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
f7e0: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
f7f0: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
f800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f810: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
f820: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
f830: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f840: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
f850: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
f860: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
f870: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
f880: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
f890: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
f8a0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
f8b0: 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
f8c0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
f8d0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
f8e0: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
f8f0: 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  set = hdr + 8 + 
f900: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
f910: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ize;.  pPage->aD
f920: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
f930: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
f940: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
f950: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
f960: 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
f970: 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
f980: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f990: 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  e];.  /* EVIDENC
f9a0: 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
f9b0: 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
f9c0: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f9d0: 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
f9e0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
f9f0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa00: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
fa10: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
fa20: 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69  nteger is.  ** i
fa30: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35  nterpreted as 65
fa40: 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  536. */.  top = 
fa50: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
fa60: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
fa70: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
fa80: 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54   R-37002-32774 T
fa90: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
faa0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20  ger at offset 3 
fab0: 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e  gives the.  ** n
fac0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
fad0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
fae0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
faf0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
fb00: 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50  dr+3]);.  if( pP
fb10: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
fb20: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  LL(pBt) ){.    /
fb30: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
fb40: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
fb50: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
fb60: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
fb70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fb80: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
fb90: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
fba0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
fbb0: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
fbc0: 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20  LL(pBt) );.  /* 
fbd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
fbe0: 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20  4089-57979 If a 
fbf0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
fc00: 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73   cells (which is
fc10: 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69   only.  ** possi
fc20: 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
fc30: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
fc40: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
fc50: 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
fc60: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
fc70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fc80: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
fc90: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
fca0: 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65  us the.  ** byte
fcb0: 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70  s of reserved sp
fcc0: 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ace. */.  assert
fcd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
fce0: 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
fcf0: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
fd00: 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c  B );..  /* A mal
fd10: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
fd20: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
fd30: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
fd40: 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66   the end.  ** of
fd50: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
fd60: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a  ng a cell.  .  *
fd70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
fd80: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
fd90: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
fda0: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
fdb0: 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61   extends.  ** pa
fdc0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
fdd0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
fde0: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
fdf0: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
fe00: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
fe10: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20  it does..  */.  
fe20: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
fe30: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
fe40: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c  e->nCell;.  iCel
fe50: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
fe60: 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42  ze - 4;.  if( pB
fe70: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
fe80: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
fe90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
fea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
feb0: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
fec0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
fed0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20  /.    int sz;   
fee0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
fef0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
ff00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ff10: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
ff20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ff30: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
ff40: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  ++){.      pc = 
ff50: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
ff60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
ff70: 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65  +i*2]);.      te
ff80: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
ff90: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
ffa0: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
ffb0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
ffc0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
ffd0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
ffe0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  st ){.        re
fff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10000 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
10010 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
10020 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
10030 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
10040 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
10050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10060 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
10070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
10080 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10090 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
100a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
100b0 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
100c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
100d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
100e0 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
100f0 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  ++;.  }  ..  /* 
10100 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
10110 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
10120 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
10130 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
10140 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
10150 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10160 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
10170 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
10180 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
10190 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
101a0 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
101b0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
101c0 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
101d0 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
101e0 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
101f0 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
10200 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
10210 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
10220 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
10230 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
10240 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
10250 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
10260 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10270 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
10280 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10290 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
102a0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
102b0 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
102c0 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
102d0 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
102e0 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
102f0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
10300 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
10310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10320 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
10330 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 20 0a 20 20  Page->pgno); .  
10340 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31    }.    while( 1
10350 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63   ){.      if( pc
10360 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10370 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
10380 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ck off the end o
10390 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
103a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
103b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
103c0 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
103d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
103e0 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
103f0 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
10400 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
10410 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
10420 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
10430 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69   + size;.      i
10440 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  f( next<=pc+size
10450 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  +3 ) break;.    
10460 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
10470 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e   }.    if( next>
10480 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  0 ){.      /* Fr
10490 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61  eeblock not in a
104a0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
104b0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
104c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
104d0 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
104e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
104f0 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64  c+size>(unsigned
10500 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20   int)usableSize 
10510 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  ){.      /* Last
10520 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e   freeblock exten
10530 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64  ds past page end
10540 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10550 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10560 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
10570 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10580 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10590 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
105a0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
105b0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
105c0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
105d0 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
105e0 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
105f0 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10600 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10610 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10620 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10630 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10640 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10650 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10660 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10670 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10680 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10690 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
106a0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
106b0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
106c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
106d0 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
106e0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
106f0 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10700 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10710 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10720 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10740 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
10750 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
10760 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
10770 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
10780 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
10790 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
107a0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
107b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
107c0 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
107d0 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
107e0 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
107f0 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
10800 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
10810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10820 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
10830 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
10840 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
10850 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
10860 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
10870 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
10880 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
10890 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
108a0 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
108b0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
108c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
108d0 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
108e0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
108f0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
10900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
10910 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
10920 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
10930 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
10940 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10950 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
10960 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
10970 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10980 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
10990 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
109a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
109b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
109c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
109d0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
109e0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
109f0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
10a00 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
10a10 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
10a20 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
10a30 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
10a40 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
10a50 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
10a60 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
10a70 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
10a80 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
10a90 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
10aa0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
10ab0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
10ac0 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
10ad0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
10ae0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
10af0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10b00 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
10b10 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
10b20 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
10b30 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
10b40 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
10b50 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
10b60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
10b70 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
10b80 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
10b90 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
10ba0 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
10bb0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10bc0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
10bd0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
10be0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
10bf0 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
10c00 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
10c10 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
10c20 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
10c30 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
10c40 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
10c50 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
10c60 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
10c70 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
10c80 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
10c90 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
10ca0 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
10cb0 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
10cc0 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
10cd0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
10ce0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
10cf0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
10d00 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
10d10 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
10d20 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
10d30 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
10d40 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
10d50 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
10d60 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
10d70 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
10d80 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
10d90 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10da0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
10db0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
10dc0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
10dd0 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
10de0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
10df0 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
10e00 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10e10 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
10e20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10e30 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
10e40 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10e50 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
10e60 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
10e70 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
10e80 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
10e90 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
10ea0 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
10eb0 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
10ec0 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
10ed0 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
10ee0 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
10ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
10f00 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10f10 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
10f20 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
10f30 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
10f40 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
10f50 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
10f60 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
10f70 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
10f80 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
10f90 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
10fa0 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
10fb0 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
10fc0 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
10fd0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
10fe0 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
10ff0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
11000 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
11010 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
11020 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
11030 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
11040 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
11050 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
11060 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
11070 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
11080 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
11090 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
110a0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
110b0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
110c0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
110d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
110e0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
110f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
11100 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
11110 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
11120 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11130 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11140 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
11150 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
11160 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
11170 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
11180 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11190 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
111a0 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
111b0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
111c0 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
111d0 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
111e0 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
111f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11200 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11210 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
11220 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11230 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
11240 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
11250 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
11260 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11270 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
11280 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11290 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
112a0 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
112b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
112c0 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
112d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
112e0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
112f0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
11300 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
11310 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
11320 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
11330 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
11340 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
11350 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
11360 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
11370 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
11380 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
11390 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
113a0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
113b0 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
113c0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
113d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
113e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
113f0 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
11400 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
11410 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
11420 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
11430 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
11440 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
11450 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11460 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
11470 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
11480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
11490 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
114a0 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
114b0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
114c0 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
114d0 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
114e0 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
114f0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
11500 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
11510 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
11520 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
11530 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
11540 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
11550 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
11560 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
11570 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
11580 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
11590 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
115a0 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
115b0 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
115c0 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
115d0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
115e0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
115f0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
11600 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
11610 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
11620 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
11630 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
11640 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
11650 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
11660 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
11670 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
11680 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
11690 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
116a0 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
116b0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
116c0 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
116d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
116e0 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
116f0 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
11700 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
11710 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
11720 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
11730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11740 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
11750 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
11760 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
11770 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
11780 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
11790 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
117a0 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
117b0 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
117c0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
117d0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
117e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
117f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
11800 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11830 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
11840 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
11850 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
11860 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11870 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
11880 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
11890 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
118a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
118b0 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
118c0 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
118d0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
118e0 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
118f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
11900 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
11910 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
11920 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
11930 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
11940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11950 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11960 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11970 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
11980 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
11990 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
119a0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
119b0 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
119c0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
119d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
119e0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
119f0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
11a00 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
11a10 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
11a20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11a30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
11a40 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11a50 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
11a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11a70 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11a80 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11a90 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
11aa0 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
11ab0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
11ac0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11ad0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
11ae0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11af0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11b00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
11b10 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
11b20 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
11b30 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11b40 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11b50 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
11b60 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
11b70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11b90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11ba0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11bb0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11bc0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
11bd0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
11be0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
11bf0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
11c00 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
11c10 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
11c20 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
11c30 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
11c40 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
11c50 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
11c60 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
11c70 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
11c80 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
11c90 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
11ca0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
11cb0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
11cc0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
11cd0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
11ce0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
11cf0 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
11d00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d10 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72  GNO(pgno);.    r
11d20 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11d30 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
11d40 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11d50 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
11d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
11d70 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11d80 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20  r:.  if( pCur ) 
11d90 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
11da0 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
11db0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11dc0 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
11dd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
11de0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11df0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
11e00 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
11e10 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
11e20 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
11e30 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
11e40 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
11e50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11e60 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
11e70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
11e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11e90 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
11ea0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
11eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11ec0 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
11ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11ee0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11ef0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11f00 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
11f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11f20 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11f30 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11f40 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
11f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11f60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11f70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11f80 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
11f90 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
11fa0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11fb0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
11fc0 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
11fd0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
11fe0 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
11ff0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
12000 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
12010 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
12020 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
12030 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
12040 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
12050 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
12060 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
12070 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
12080 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
12090 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
120a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
120b0 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
120c0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
120d0 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
120e0 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
120f0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
12100 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
12110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
12120 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
12130 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12140 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12150 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12160 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
12170 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12180 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
12190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
121a0 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
121b0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
121c0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
121d0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
121e0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
121f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
12200 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
12210 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
12220 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
12230 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
12240 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
12250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12260 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
12270 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
12280 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
12290 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
122a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
122b0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
122c0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
122d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
122e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
122f0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
12300 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
12310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
12320 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
12330 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12340 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
12350 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
12360 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
12370 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
12380 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
12390 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
123a0 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
123b0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
123c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
123d0 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
123e0 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
123f0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
12400 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12410 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
12420 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
12430 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
12440 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
12450 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
12460 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
12470 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
12480 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
12490 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
124a0 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
124b0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
124c0 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
124d0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
124e0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
124f0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
12500 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12510 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
12520 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
12530 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
12540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12550 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12560 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12570 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
12580 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
12590 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
125a0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
125b0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
125c0 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
125d0 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
125e0 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
125f0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
12600 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
12610 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
12620 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
12630 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
12640 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
12650 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
12660 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
12670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12680 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
12690 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
126a0 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
126b0 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
126c0 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
126d0 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
126e0 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
126f0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
12700 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
12710 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
12720 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
12730 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
12740 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
12750 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
12760 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
12770 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12780 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
12790 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
127a0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
127b0 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
127c0 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
127d0 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
127e0 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
127f0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
12800 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
12810 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12820 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12830 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
12840 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
12850 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
12860 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
12870 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
12880 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
12890 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
128a0 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
128b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
128c0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
128d0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
128e0 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
128f0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
12900 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
12910 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
12920 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
12930 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
12940 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
12950 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
12960 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
12970 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
12980 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
12990 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
129a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
129b0 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
129c0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
129d0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
129e0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
129f0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
12a00 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
12a10 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
12a20 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
12a30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
12a40 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
12a50 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
12a60 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
12a70 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
12a80 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
12a90 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
12aa0 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
12ab0 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
12ac0 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
12ad0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
12ae0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
12af0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
12b00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12b10 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
12b20 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
12b30 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
12b40 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
12b50 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
12b60 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
12b70 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
12b80 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
12b90 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
12ba0 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
12bb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12bc0 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
12bd0 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
12be0 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
12bf0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
12c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
12c10 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
12c20 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
12c30 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
12c40 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
12c50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
12c60 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
12c70 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
12c80 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
12c90 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
12ca0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12cb0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
12cc0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
12cd0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
12ce0 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
12cf0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12d00 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
12d10 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
12d20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
12d40 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
12d50 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
12d60 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
12d70 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
12d80 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
12d90 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
12da0 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
12db0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
12dc0 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
12dd0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12de0 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e00 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
12e10 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
12e20 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
12e30 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
12e40 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
12e50 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
12e60 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
12e70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
12e80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12e90 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
12ea0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
12eb0 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12ed0 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
12ee0 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
12ef0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
12f00 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
12f10 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
12f20 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
12f30 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
12f40 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
12f50 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
12f60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
12f70 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
12f80 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
12f90 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
12fa0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
12fb0 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
12fc0 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
12fd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
12fe0 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
12ff0 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
13000 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
13010 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
13020 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
13030 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
13040 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
13050 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
13060 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
13070 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
13080 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
13090 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
130b0 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
130c0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
130d0 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
130f0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
13100 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
13110 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
13120 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
13130 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
13140 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
13150 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13160 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
13170 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13180 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
13190 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
131a0 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
131b0 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
131c0 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
131d0 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
131e0 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
131f0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
13200 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
13210 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
13220 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
13230 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
13240 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
13250 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
13260 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
13270 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
13280 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
13290 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
132a0 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
132b0 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
132c0 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
132d0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
132e0 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
132f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
13300 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
13310 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
13320 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
13330 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
13340 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
13350 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
13360 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
13370 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
13380 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
13390 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
133a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
133b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
133c0 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
133d0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
133e0 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
133f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13400 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13410 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
13420 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
13430 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
13440 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
13450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13460 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
13470 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13480 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
13490 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
134a0 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
134b0 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
134c0 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
134d0 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
134e0 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
134f0 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
13500 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
13510 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
13520 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
13530 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
13540 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
13550 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
13560 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13570 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
13580 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
13590 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
135a0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
135b0 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
135c0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
135d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
135e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
135f0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
13600 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
13610 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
13620 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
13630 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13640 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13650 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
13660 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
13670 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
13680 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
13690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
136a0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
136b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
136c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
136d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
136e0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
136f0 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
13700 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
13710 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
13720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13740 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
13750 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
13790 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
137a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
137b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
137c0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
137d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
137e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
137f0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
13800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13810 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
13820 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
13830 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
13840 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13850 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13860 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
13870 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13880 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
13890 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
138a0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
138b0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
138c0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
138d0 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
138e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
138f0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
13900 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
13910 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
13920 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
13930 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
13940 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
13950 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
13960 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
13970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
13980 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
13990 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
139a0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
139b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
139e0 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
139f0 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
13a00 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
13a10 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
13a20 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
13a30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
13a40 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
13a50 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
13a60 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
13a70 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
13a80 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
13a90 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13ab0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13ac0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13ae0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13af0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
13b00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13b10 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
13b20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
13b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13b40 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
13b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b60 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
13b70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b90 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
13ba0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
13bb0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
13bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13bd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13be0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13bf0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
13c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c10 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
13c20 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
13c30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13c40 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
13c50 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
13c60 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
13c70 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
13c80 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
13c90 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
13ca0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
13cb0 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
13cc0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
13cd0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
13ce0 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
13cf0 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
13d00 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
13d10 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
13d20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
13d30 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
13d40 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
13d50 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
13d60 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
13d70 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
13d80 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
13d90 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
13da0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
13db0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
13dc0 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
13dd0 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
13de0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
13df0 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
13e00 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
13e10 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
13e20 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
13e30 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
13e40 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
13e50 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
13e60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13e70 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
13e80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13e90 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
13ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13eb0 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
13ec0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13ed0 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
13ee0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13ef0 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
13f00 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
13f10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
13f20 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
13f30 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
13f40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13f50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
13f60 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13f70 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13f90 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
13fa0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
13fb0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
13fe0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
13ff0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
14000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
14020 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
14030 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
14040 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
14050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14060 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
14070 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
14080 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
14090 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
140a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
140b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
140c0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
140d0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
140e0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
140f0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
14100 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
14110 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
14120 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
14130 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
14140 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
14150 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
14160 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
14170 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
14180 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
14190 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
141a0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
141b0 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
141c0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
141d0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
141e0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
141f0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
14200 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
14210 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14220 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
14230 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
14240 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
14250 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
14260 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
14270 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
14280 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
14290 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
142a0 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
142b0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
142c0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
142d0 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
142e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
142f0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
14300 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
14310 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
14320 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
14330 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
14340 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
14350 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
14360 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
14370 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
14380 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
14390 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
143a0 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
143b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
143c0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
143d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
143e0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
143f0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
14400 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
14410 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
14420 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
14430 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
14440 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
14450 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
14460 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
14470 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
14480 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14490 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
144a0 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
144b0 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
144c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
144d0 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
144e0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
144f0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
14500 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
14510 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
14520 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
14530 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
14540 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
14550 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
14560 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
14570 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
14580 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
14590 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
145a0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
145b0 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
145c0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
145d0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
145e0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
145f0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
14600 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14610 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
14620 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
14630 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14640 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
14650 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
14660 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
14670 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
14680 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14690 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
146a0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
146b0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
146c0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
146d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
146e0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
146f0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
14700 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
14710 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14720 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
14730 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
14740 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14750 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
14760 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14770 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
14780 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
14790 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
147a0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
147b0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
147c0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
147d0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
147e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
147f0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
14800 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
14810 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
14820 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
14830 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
14840 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
14850 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
14860 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
14870 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
14880 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
14890 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
148a0 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
148b0 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
148c0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
148d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
148e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
148f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14910 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
14920 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
14930 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
14940 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
14950 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
14960 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20  /.    pBt->nRef 
14970 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 1;.    if( p->
14980 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14990 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
149a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
149b0 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
149c0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
149d0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
149e0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
149f0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14a00 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
14a10 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
14a20 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
14a30 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14a40 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
14a50 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
14a60 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
14a70 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14a80 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
14a90 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
14aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
14ac0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
14ad0 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
14ae0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
14af0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14b10 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
14b20 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
14b30 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
14b40 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14b50 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
14b60 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
14b70 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14b80 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
14b90 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
14ba0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14bb0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14bc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
14bd0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
14be0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14bf0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
14c00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
14c10 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
14c20 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
14c30 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
14c40 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
14c50 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
14c60 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
14c70 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
14c80 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
14c90 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
14ca0 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
14cb0 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
14cc0 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
14cd0 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
14ce0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
14cf0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
14d00 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
14d10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14d20 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
14d30 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
14d40 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
14d50 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
14d60 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
14d70 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
14d80 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
14d90 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
14da0 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70       if( (uptr)p
14db0 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62  ->pBt<(uptr)pSib
14dc0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14dd0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14de0 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
14df0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14e00 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
14e10 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
14e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14e30 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
14e40 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62  xt && (uptr)pSib
14e50 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70  ->pNext->pBt<(up
14e60 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  tr)p->pBt ){.   
14e70 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
14e80 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
14e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ea0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14eb0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
14ec0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
14ed0 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
14ee0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
14f00 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
14f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14f20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
14f30 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
14f40 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
14f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14f60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
14f70 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
14f80 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
14f90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14fa0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
14fb0 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
14fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14fd0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
14fe0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
14ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15000 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
15010 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
15020 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
15030 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15040 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a  3_file *pFile;..
15050 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
15060 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
15070 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
15080 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
15090 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
150a0 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
150b0 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
150c0 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
150d0 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
150e0 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
150f0 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
15100 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15110 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
15120 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
15130 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
15140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
15150 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15160 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
15170 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
15180 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
15190 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  );.    }..    pF
151a0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
151b0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
151c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  er);.    if( pFi
151d0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  le->pMethods ){.
151e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
151f0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
15200 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
15210 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26  TL_PDB, (void*)&
15220 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  pBt->db);.    }.
15230 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
15240 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
15250 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15260 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
15270 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
15280 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15290 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73  xOpen);.  }.  as
152a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
152b0 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  _OK || sqlite3Bt
152c0 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  reeConnectionCou
152d0 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29  nt(*ppBtree)>0 )
152e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
152f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
15300 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
15310 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
15320 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
15330 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
15340 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
15350 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
15360 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
15370 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
15380 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
15390 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
153a0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
153b0 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
153c0 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
153d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
153e0 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
153f0 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
15400 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
15410 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15420 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
15430 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
15440 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
15450 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
15460 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
15470 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
15480 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15490 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
154a0 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
154b0 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
154c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
154d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
154e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
154f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15500 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
15510 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
15520 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
15530 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
15540 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15550 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15560 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
15570 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
15580 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15590 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
155a0 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
155b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
155c0 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
155d0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
155e0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
155f0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
15600 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
15610 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
15620 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
15630 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
15640 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15650 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
15660 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
15670 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
15680 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
15690 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
156a0 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
156b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
156c0 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
156d0 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
156e0 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
156f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15700 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
15710 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
15720 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
15730 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
15740 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
15750 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
15760 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
15770 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
15780 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
15790 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74  tes with a 4-byt
157a0 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c  e prefix for a l
157b0 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69  eft-child.** poi
157c0 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
157d0 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
157e0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
157f0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
15800 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15810 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15820 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
15830 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
15840 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
15850 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
15860 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
15870 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
15880 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
15890 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
158a0 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
158b0 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
158c0 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
158d0 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
158e0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
158f0 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
15900 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
15910 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
15920 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
15930 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
15940 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
15950 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
15960 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
15970 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
15980 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
15990 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
159a0 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
159b0 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
159c0 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
159d0 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
159e0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
159f0 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
15a00 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
15a10 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
15a20 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
15a30 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
15a40 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
15a50 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
15a60 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
15a70 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
15a80 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
15a90 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
15aa0 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
15ab0 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
15ac0 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
15ad0 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
15ae0 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20   space here..   
15af0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a   **.    ** Also:
15b00 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62    Provide four b
15b10 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69  ytes of initiali
15b20 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65  zed space before
15b30 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69   the.    ** begi
15b40 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61  nning of pTmpSpa
15b50 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76  ce as an area av
15b60 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65  ailable to prepe
15b70 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  nd the.    ** le
15b80 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ft-child pointer
15b90 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
15ba0 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20  g of a cell..   
15bb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
15bc0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15bd0 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e      memset(pBt->
15be0 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29  pTmpSpace, 0, 8)
15bf0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d  ;.      pBt->pTm
15c00 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20  pSpace += 4;.   
15c10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15c20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
15c30 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
15c40 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
15c50 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
15c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15c70 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
15c80 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
15c90 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b  >pTmpSpace -= 4;
15ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
15cb0 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70  Free(pBt->pTmpSp
15cc0 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ace);.    pBt->p
15cd0 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
15ce0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
15cf0 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
15d00 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
15d10 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
15d20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d30 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
15d40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15d50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
15d60 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
15d70 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
15d80 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
15d90 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
15da0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
15db0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15dc0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
15dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15de0 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
15df0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
15e00 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
15e10 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
15e20 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
15e30 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
15e40 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
15e50 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
15e60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15e70 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
15e80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15e90 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
15ea0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
15eb0 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
15ec0 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
15ed0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
15ee0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
15ef0 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
15f00 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
15f10 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
15f20 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
15f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
15f40 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
15f50 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
15f60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15f70 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
15f80 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
15f90 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
15fa0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
15fb0 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
15fc0 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
15fd0 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
15fe0 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
15ff0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
16000 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
16010 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
16020 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
16030 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
16040 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
16050 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
16060 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
16070 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
16080 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
16090 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
160a0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
160b0 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
160c0 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
160d0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
160e0 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
160f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
16100 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
16110 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
16120 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
16130 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
16140 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
16150 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
16160 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
16170 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  b);.    if( pBt-
16180 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
16190 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
161a0 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
161b0 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
161c0 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
161d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
161e0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
161f0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
16200 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
16210 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
16220 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16230 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
16240 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
16250 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
16260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16270 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16280 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
16290 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
162a0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
162b0 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
162c0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
162d0 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
162e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
162f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16300 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
16310 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22  hange the "soft"
16320 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
16330 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16340 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55   the cache..** U
16350 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69  nused and unmodi
16360 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20  fied pages will 
16370 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e  be recycled when
16380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
16390 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  * pages in the c
163a0 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69  ache exceeds thi
163b0 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42  s soft limit.  B
163c0 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ut the size of t
163d0 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61  he.** cache is a
163e0 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c  llowed to grow l
163f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
16400 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74  limit if it cont
16410 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61  ains.** dirty pa
16420 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69  ges or pages sti
16430 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65  ll in active use
16440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16450 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
16460 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16470 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
16480 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16490 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
164a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
164b0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
164c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
164d0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
164e0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
164f0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16500 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
16510 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16520 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16530 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
16540 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c  hange the "spill
16550 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
16560 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
16570 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
16580 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
16590 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74   pages exceeds t
165a0 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67  his limit during
165b0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
165c0 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67  tion,.** the pag
165d0 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74  er might attempt
165e0 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65   to "spill" page
165f0 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
16600 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64   early in.** ord
16610 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
16620 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
16630 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
16640 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  s the current sp
16650 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65  ill size.  If ze
16660 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20  ro is passed.** 
16670 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20  as an argument, 
16680 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
16690 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c  ade to the spill
166a0 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73   size setting, s
166b0 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67  o.** using mxPag
166c0 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20  e of 0 is a way 
166d0 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72  to query the cur
166e0 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
166f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16700 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
16710 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
16720 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
16730 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16740 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
16750 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16760 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16780 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16790 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  );.  res = sqlit
167a0 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73  e3PagerSetSpills
167b0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
167c0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
167d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
167e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
167f0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
16800 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
16810 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
16820 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
16830 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
16840 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
16850 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
16860 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
16870 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
16880 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
16890 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
168a0 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
168b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
168c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
168d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
168e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
168f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16900 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
16910 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
16920 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
16930 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
16940 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16960 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
16970 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16980 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
16990 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
169a0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
169b0 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
169c0 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
169d0 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
169e0 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
169f0 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
16a00 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
16a10 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
16a20 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
16a30 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
16a40 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
16a50 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
16a60 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
16a70 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
16a80 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
16a90 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
16aa0 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
16ab0 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
16ac0 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
16ad0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
16ae0 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
16af0 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
16b00 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
16b10 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
16b20 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
16b30 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
16b40 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
16b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
16b60 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
16b70 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
16b80 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
16b90 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
16ba0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
16bb0 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
16bc0 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
16bd0 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
16be0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
16bf0 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
16c00 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
16c10 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16c20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16c30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16c40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16c50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16c60 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16c70 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
16c80 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
16c90 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
16ca0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16cc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16cd0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
16ce0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
16cf0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
16d00 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
16d10 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
16d20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
16d30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16d40 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
16d50 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
16d60 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
16d70 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
16d80 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
16d90 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
16da0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
16db0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
16dc0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
16dd0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
16de0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
16df0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
16e00 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16e10 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
16e20 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16e30 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16e40 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
16e50 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
16e60 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
16e70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16e80 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
16e90 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
16ea0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
16eb0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
16ec0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
16ed0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
16ee0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
16ef0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
16f00 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
16f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16f20 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16f30 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16f40 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16f50 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
16f60 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
16f70 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
16f80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
16f90 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
16fa0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16fb0 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
16fc0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
16fd0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
16fe0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
16ff0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
17000 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
17010 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
17020 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
17030 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
17040 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
17050 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
17060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
17070 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17080 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17090 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
170a0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
170b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
170c0 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
170d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
170e0 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
170f0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17100 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
17110 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
17120 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
17130 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
17140 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
17150 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
17160 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17170 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
17180 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17190 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
171a0 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
171b0 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
171c0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
171d0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
171e0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
171f0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
17200 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
17210 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
17220 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
17230 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
17240 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
17250 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
17260 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
17270 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
17280 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17290 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
172a0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
172b0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
172c0 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
172d0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
172e0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
172f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
17300 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
17310 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
17320 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
17330 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
17340 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
17350 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
17360 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
17370 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
17380 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
17390 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
173a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
173b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
173c0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
173d0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
173e0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
173f0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
17400 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
17410 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
17420 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
17430 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17440 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
17450 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
17460 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
17470 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
17480 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
17490 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
174a0 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
174b0 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
174c0 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
174d0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
174e0 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
174f0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
17500 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
17510 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
17520 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
17530 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
17540 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
17550 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
17560 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17570 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
17580 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
17590 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
175a0 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
175b0 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
175c0 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
175d0 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
175e0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
175f0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
17600 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
17610 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
17620 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
17630 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17640 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
17650 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
17660 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
17670 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17680 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
17690 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
176a0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
176b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
176c0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
176d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
176e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
176f0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
17700 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
17710 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
17720 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
17730 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
17740 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
17750 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
17760 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
17770 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
17780 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
17790 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
177a0 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
177b0 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
177c0 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
177d0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
177e0 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
177f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
17800 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
17810 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
17820 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
17830 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
17840 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
17850 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17860 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
17870 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
17880 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
17890 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
178a0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
178b0 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
178c0 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
178d0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
178e0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
178f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17900 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17910 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
17920 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
17930 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
17940 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
17950 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
17960 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
17970 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
17980 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
17990 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
179a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
179b0 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
179c0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
179d0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
179e0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
179f0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
17a00 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
17a10 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
17a20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
17a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
17a40 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
17a50 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
17a60 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
17a70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17a80 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17a90 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
17aa0 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
17ab0 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
17ac0 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
17ad0 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
17ae0 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
17af0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
17b00 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
17b10 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17b20 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
17b30 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
17b40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17b50 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
17b60 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17b70 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
17b80 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
17b90 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
17ba0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17bb0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
17bc0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
17bd0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
17be0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17bf0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
17c00 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
17c10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
17c20 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
17c30 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
17c40 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
17c50 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
17c60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17c70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17c80 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
17c90 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
17ca0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
17cb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
17cc0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
17cd0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
17ce0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
17cf0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
17d00 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
17d10 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
17d20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
17d30 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
17d40 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
17d50 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
17d60 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17d70 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
17d80 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
17d90 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
17da0 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
17db0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
17dc0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
17dd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17de0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17e00 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
17e10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17e20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17e40 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
17e50 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
17e60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17e70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
17e80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
17e90 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
17ea0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
17eb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17ec0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17ed0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
17ee0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
17ef0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
17f00 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
17f10 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
17f20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17f30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17f40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
17f50 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
17f60 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
17f70 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
17f80 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
17f90 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
17fa0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
17fb0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17fc0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
17fd0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
17fe0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17ff0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
18000 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18010 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
18020 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
18030 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
18040 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
18050 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18060 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
18070 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
18080 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
18090 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
180a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
180b0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
180c0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
180d0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
180e0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
180f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18100 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18120 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
18130 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
18140 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
18150 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18160 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
18170 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
18180 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
18190 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
181a0 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
181b0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
181c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
181d0 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
181e0 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
181f0 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
18200 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18210 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
18220 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18230 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 74 61 74 69  YNCHRONOUS.stati
18240 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
18250 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
18260 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
18270 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
18280 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
18290 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
182a0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
182b0 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
182c0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
182d0 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
182e0 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
182f0 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
18300 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
18310 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
18320 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
18330 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
18340 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
18350 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
18360 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
18370 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
18380 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
18390 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
183a0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
183b0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
183c0 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
183d0 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
183e0 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
183f0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
18400 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
18410 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
18420 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
18430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ndif../*.** Get 
18440 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
18450 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
18460 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
18470 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
18480 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
18490 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
184a0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
184b0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
184c0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
184d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
184e0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
184f0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
18500 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18510 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
18520 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
18530 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
18540 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
18550 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
18560 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
18570 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
18580 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
18590 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
185a0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
185b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
185c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
185d0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
185e0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
185f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
18600 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
18610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18620 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
18630 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18640 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
18650 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
18660 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
18670 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
18680 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
186a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
186b0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
186c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
186d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
186e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
186f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
18700 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18710 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
18720 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
18730 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
18740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18750 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
18760 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
18770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
18780 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
18790 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
187a0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
187b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
187c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
187d0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
187e0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
187f0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
18800 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
18810 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
18820 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
18830 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
18840 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
18850 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
18860 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
18870 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
18880 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
18890 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
188a0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
188b0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
188c0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
188d0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
188e0 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
188f0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
18900 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
18910 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
18920 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
18930 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
18940 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
18950 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
18960 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
18970 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
18980 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18990 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
189a0 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
189b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
189c0 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
189d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
189e0 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
189f0 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
18a00 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
18a10 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
18a20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
18a30 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
18a40 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
18a50 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
18a60 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18a70 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
18a80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
18a90 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
18aa0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
18ab0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
18ac0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
18ad0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
18ae0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
18af0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18b00 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18b10 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
18b20 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
18b30 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
18b40 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
18b50 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
18b60 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
18b70 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
18b80 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18b90 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
18ba0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
18bb0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
18bc0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
18bd0 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
18be0 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
18bf0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
18c00 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
18c10 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
18c20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
18c30 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
18c40 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
18c50 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
18c60 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
18c70 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
18c80 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
18c90 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
18ca0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
18cb0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
18cc0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
18cd0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
18ce0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
18cf0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
18d00 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
18d10 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
18d20 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
18d30 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
18d40 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
18d50 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
18d60 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
18d70 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
18d80 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
18d90 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
18da0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
18db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18dc0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
18dd0 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
18de0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
18df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18e00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
18e10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18e30 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
18e40 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
18e50 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
18e60 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
18e70 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
18e80 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
18e90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18ea0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
18eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18ec0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
18ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
18ee0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
18ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18f00 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
18f10 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
18f20 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18f30 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65  OUS+1);.    }.#e
18f40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
18f50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
18f60 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
18f70 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
18f80 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
18f90 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
18fa0 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
18fb0 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
18fc0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
18fd0 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
18fe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18ff0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
19000 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
19010 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
19020 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
19030 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
19040 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
19050 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
19060 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
19070 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
19080 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
19090 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
190a0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
190b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
190c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
190d0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
190e0 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
190f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19100 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
19110 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
19120 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
19130 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
19140 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
19150 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
19160 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
19170 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
19180 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
19190 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
191a0 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
191b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
191c0 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
191d0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
191e0 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
191f0 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
19200 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
19210 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
19220 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
19230 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
19240 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
19250 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
19260 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
19270 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
19280 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
19290 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
192a0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
192b0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
192c0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
192d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
192e0 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
192f0 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
19300 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
19310 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
19320 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
19330 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
19340 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
19350 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
19360 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
19370 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
19380 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
19390 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
193a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
193b0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
193c0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
193d0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
193e0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
193f0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
19400 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
19410 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
19420 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
19430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19440 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
19450 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
19460 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
19470 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
19480 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
19490 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
194a0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
194b0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
194c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
194d0 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
194e0 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
194f0 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
19500 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
19510 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
19520 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
19530 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
19540 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
19550 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
19560 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
19570 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
19580 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
19590 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
195a0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
195b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
195c0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
195d0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
195e0 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
195f0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
19600 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
19610 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
19620 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
19630 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
19640 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
19650 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
19660 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
19670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19680 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
19690 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
196a0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
196d0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
196e0 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
196f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19700 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
19710 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
19720 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
19730 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
19740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19750 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19760 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
19770 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
19790 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
197a0 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
197b0 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
197c0 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
197d0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
197e0 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
197f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
19800 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
19810 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
19820 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
19830 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
19840 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
19850 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
19860 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
19870 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19880 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19890 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
198a0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
198b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
198c0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
198d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
198e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
198f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19900 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
19910 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
19920 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
19930 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
19940 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
19950 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
19960 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
19970 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
19980 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
19990 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
199a0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
199b0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
199c0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
199d0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
199e0 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
199f0 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
19a00 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
19a10 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
19a20 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
19a30 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
19a40 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
19a50 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
19a60 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
19a70 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
19a80 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
19a90 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
19aa0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
19ab0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
19ac0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
19ad0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
19ae0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
19af0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
19b00 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
19b10 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
19b20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
19b30 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
19b40 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
19b50 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
19b60 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
19b70 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
19b80 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
19b90 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
19ba0 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
19bb0 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
19bc0 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
19bd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
19be0 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
19bf0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
19c00 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
19c10 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
19c20 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
19c30 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
19c40 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
19c50 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
19c60 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
19c70 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19c80 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
19c90 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
19ca0 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
19cb0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
19cc0 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
19cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
19ce0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19cf0 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
19d00 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
19d10 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
19d20 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
19d30 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
19d40 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
19d50 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
19d60 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
19d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19d80 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
19d90 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
19da0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
19db0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
19dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
19dd0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
19de0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19df0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
19e00 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
19e10 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
19e20 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
19e30 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
19e40 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
19e50 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
19e60 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
19e70 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
19e80 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19e90 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
19ea0 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
19eb0 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
19ec0 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
19ed0 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
19ee0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
19ef0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
19f00 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
19f10 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
19f20 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
19f30 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
19f40 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19f50 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
19f60 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
19f70 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
19f80 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
19f90 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
19fa0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
19fb0 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
19fc0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
19fd0 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
19fe0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
19ff0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1a000 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1a010 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1a020 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1a030 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1a040 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1a050 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1a060 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1a070 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1a080 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1a090 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1a0a0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1a0b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1a0c0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1a0d0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1a0e0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1a0f0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1a100 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1a110 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1a120 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a130 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1a140 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1a150 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1a160 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a170 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1a180 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1a190 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1a1a0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1a1b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1a1c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1a1d0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1a1e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1a1f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a200 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1a210 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1a220 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1a230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a240 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a250 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1a260 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1a270 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1a280 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1a290 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1a2a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a2b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1a2c0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1a2d0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1a2e0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1a2f0 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1a300 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1a310 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1a320 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1a330 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1a340 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1a350 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1a360 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
1a370 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
1a380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1a390 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1a3a0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1a3b0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1a3c0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1a3d0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1a3e0 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1a3f0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1a400 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1a410 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1a420 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1a430 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a440 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1a450 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a460 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1a470 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1a480 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a490 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1a4a0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1a4b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a4d0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1a4e0 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1a4f0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1a500 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1a510 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a520 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1a530 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1a540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1a550 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1a560 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1a570 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1a580 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1a590 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1a5a0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1a5b0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1a5c0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1a5d0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1a5e0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1a5f0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1a600 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1a610 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1a620 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1a630 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1a640 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1a650 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1a660 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1a670 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1a680 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1a690 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a6a0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1a6b0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1a6c0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1a6d0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1a6e0 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1a6f0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1a700 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1a710 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1a720 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1a730 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1a740 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1a750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a760 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a770 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1a780 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1a790 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1a7a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a7b0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1a7c0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1a7d0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1a7e0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1a7f0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1a800 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1a810 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1a820 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1a830 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1a840 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1a850 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1a860 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a870 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1a880 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1a890 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1a8a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1a8b0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1a8c0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1a8d0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1a8e0 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1a8f0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1a900 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1a910 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1a920 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1a930 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1a940 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a950 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1a960 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1a970 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a980 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1a990 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1a9a0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1a9b0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1a9c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a9d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a9e0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1a9f0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1aa00 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1aa10 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1aa20 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1aa30 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1aa40 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1aa50 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1aa60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1aa70 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1aa80 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1aa90 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1aaa0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1aab0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1aac0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1aad0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1aae0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1aaf0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1ab00 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1ab10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1ab20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1ab30 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1ab40 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1ab50 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1ab60 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1ab70 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1ab80 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1ab90 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1aba0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1abb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1abc0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1abd0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1abe0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1abf0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1ac00 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1ac10 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1ac20 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1ac30 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1ac40 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1ac50 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1ac60 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1ac70 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1ac80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1ac90 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1aca0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1acb0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1acc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1acd0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1ace0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1acf0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1ad00 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1ad10 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1ad20 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1ad30 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1ad40 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1ad50 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1ad60 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1ad70 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1ad80 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1ad90 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1ada0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1adb0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1adc0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1add0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1ade0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1adf0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1ae00 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1ae10 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1ae20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1ae30 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1ae40 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1ae50 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1ae60 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1ae70 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1ae80 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1ae90 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1aea0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1aeb0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1aec0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1aed0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1aee0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1aef0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1af00 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1af10 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1af20 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1af30 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1af40 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1af50 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1af60 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1af70 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1af80 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1af90 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1afa0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1afb0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1afc0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1afd0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1afe0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1aff0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1b000 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1b010 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1b020 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1b030 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1b040 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1b050 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1b060 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1b070 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b080 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1b090 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1b0a0 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1b0b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b0c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b0d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1b0e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b0f0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b100 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b110 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1b120 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1b130 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1b140 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1b150 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1b160 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1b170 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1b180 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1b190 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1b1a0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1b1b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b1c0 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1b1d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1b1e0 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1b1f0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b200 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1b210 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b220 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b230 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1b240 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1b250 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1b260 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1b270 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1b280 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1b290 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1b2a0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1b2b0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1b2c0 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1b2d0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1b2e0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b2f0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b300 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1b310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b320 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a  HARED_CACHE.  {.
1b330 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c      sqlite3 *pBl
1b340 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  ock = 0;.    /* 
1b350 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
1b360 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
1b370 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
1b380 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b390 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69  n .    ** on thi
1b3a0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
1b3b0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
1b3c0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
1b3d0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a  saction is.    *
1b3e0 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
1b3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1b400 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  D..    */.    if
1b410 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1b420 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b430 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1b440 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
1b450 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
1b460 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  NG)!=0.    ){.  
1b470 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
1b480 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
1b490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66     }else if( wrf
1b4a0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42  lag>1 ){.      B
1b4b0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
1b4c0 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1b4d0 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1b4e0 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1b4f0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1b500 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1b510 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =p ){.          
1b520 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1b530 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1b540 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c     }.    if( pBl
1b570 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ock ){.      sql
1b580 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1b590 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
1b5a0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
1b5b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1b5c0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
1b5d0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b5e0 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  un;.    }.  }.#e
1b5f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
1b600 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
1b610 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
1b620 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
1b630 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
1b640 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
1b650 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
1b660 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
1b670 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
1b680 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
1b690 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
1b6a0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
1b6b0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
1b6c0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
1b6d0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1b6e0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
1b6f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
1b700 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
1b710 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1b720 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
1b730 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
1b740 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
1b750 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
1b760 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b770 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
1b780 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
1b790 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
1b7a0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
1b7b0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
1b7c0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
1b7d0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
1b7e0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1b7f0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1b800 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
1b810 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
1b820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b830 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
1b840 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
1b850 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
1b860 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
1b870 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
1b880 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1b890 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1b8a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
1b8b0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
1b8c0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1b8d0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
1b8e0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
1b8f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
1b900 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1b910 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1b920 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
1b930 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
1b940 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
1b950 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
1b960 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
1b970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b980 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1b990 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
1b9a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1b9b0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
1b9c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b9d0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1b9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b9f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ba00 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
1ba10 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
1ba20 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1ba30 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
1ba40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ba50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ba60 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1ba70 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
1ba80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ba90 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
1baa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bab0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1bac0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1bad0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
1bae0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
1baf0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
1bb00 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1bb10 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
1bb20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
1bb30 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
1bb40 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1bb50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1bb60 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1bb70 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1bb80 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1bb90 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1bba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1bbb0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1bbc0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1bbd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1bbe0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1bbf0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1bc00 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1bc10 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1bc20 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1bc30 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1bc40 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1bc50 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1bc60 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1bc70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1bc80 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1bc90 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1bca0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1bcb0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1bcc0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1bcd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1bce0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1bcf0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1bd00 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1bd10 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1bd20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1bd30 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1bd40 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1bd50 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1bd60 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1bd70 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1bd80 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1bd90 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1bda0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1bdb0 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1bdc0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1bdd0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1bde0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1bdf0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1be00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1be10 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1be20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1be30 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1be40 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1be50 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1be60 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1be70 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1be80 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1be90 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1bea0 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1beb0 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1bec0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1bed0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1bee0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1bef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1bf00 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1bf10 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1bf20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1bf30 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1bf40 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1bf50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1bf60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1bf70 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1bf80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1bf90 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1bfa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bfb0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1bfc0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1bfd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bfe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bff0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c000 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1c010 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1c020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c030 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
1c040 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
1c050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c060 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
1c070 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1c080 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1c090 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1c0a0 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1c0b0 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
1c0c0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
1c0d0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1c0e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1c0f0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
1c100 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1c110 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1c120 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1c130 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1c140 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1c150 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1c160 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1c170 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1c180 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
1c190 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1c1a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1c1b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c1c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1c1d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c1e0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1c1f0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1c200 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1c210 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1c220 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1c230 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1c240 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1c250 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1c260 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1c270 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1c280 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1c290 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1c2a0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1c2b0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1c2c0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1c2d0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1c2e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1c310 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1c320 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1c330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c340 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1c350 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1c360 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c390 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1c3a0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1c3b0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
1c3c0 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
1c3d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c3e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1c3f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1c400 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65   );.  rc = pPage
1c410 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1c420 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1c430 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1c440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c460 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1c470 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1c480 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1c490 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1c4a0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1c4b0 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1c4c0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1c4d0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1c4e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1c4f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1c500 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1c510 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1c520 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1c530 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1c540 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1c550 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1c560 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1c570 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1c580 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1c590 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1c5a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c5b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1c5c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c5d0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1c5e0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1c5f0 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1c600 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c610 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1c620 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1c630 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1c640 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1c650 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1c660 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1c670 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1c680 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1c690 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1c6a0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1c6b0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1c6c0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1c6d0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1c6e0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1c6f0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1c700 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1c730 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1c740 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1c750 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1c760 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1c770 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1c780 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1c790 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1c7a0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1c7b0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1c7c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1c7d0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1c7e0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1c7f0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1c800 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1c810 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1c820 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1c830 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1c840 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1c850 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1c860 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1c870 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1c880 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1c890 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1c8a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c8b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1c8c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1c8d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1c8e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1c8f0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1c900 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1c910 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1c920 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1c930 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1c940 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1c950 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1c960 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1c970 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1c980 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1c990 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1c9a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c9b0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
1c9c0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gno);.    }.    
1c9d0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1c9e0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1c9f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1ca00 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1ca10 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1ca20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1ca30 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1ca40 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1ca50 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1ca60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ca70 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1ca80 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1ca90 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1caa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1cab0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1cac0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1cad0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1cae0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1caf0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1cb00 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1cb10 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1cb20 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1cb30 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1cb40 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
1cb50 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
1cb60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1cb70 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1cb80 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
1cb90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1cba0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1cbb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cbc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
1cbd0 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
1cbe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cbf0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
1cc00 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1cc10 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a  nfo.nSize-4) ){.
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1cc30 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1cc40 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1cc50 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cc70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1cc80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1cc90 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1cca0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1ccb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1ccc0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1ccd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ccf0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1cd00 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1cd10 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1cd20 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1cd30 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1cd40 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1cd50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1cd60 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1cd70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cd80 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
1cd90 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1cda0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1cdb0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1cdc0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1cdd0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1cde0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1ce00 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1ce10 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1ce20 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1ce30 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1ce40 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1ce50 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1ce60 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1ce70 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1ce80 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1ce90 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1cea0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1ceb0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1cec0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1ced0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1cee0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1cef0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1cf00 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1cf10 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1cf20 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1cf30 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1cf40 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1cf50 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1cf60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1cf70 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1cf80 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1cf90 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1cfa0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1cfb0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1cfc0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1cfd0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1d000 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1d010 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d020 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1d030 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d040 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1d050 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d060 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1d070 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1d080 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1d090 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1d0a0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1d0b0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1d0c0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1d0d0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1d0e0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1d0f0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1d100 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1d110 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1d120 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1d130 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1d140 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1d150 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1d160 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d170 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1d180 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1d190 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1d1a0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1d1b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d1c0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1d1d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1d1e0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1d1f0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1d200 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d210 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d220 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1d230 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1d240 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1d250 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1d260 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1d270 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1d280 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1d290 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1d2a0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1d2b0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1d2c0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1d2d0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1d2e0 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1d2f0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d300 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1d310 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d320 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1d330 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1d340 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1d350 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1d360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d370 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d380 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1d390 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1d3a0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1d3b0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1d3c0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1d3d0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1d3e0 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1d3f0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1d400 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1d410 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1d420 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1d430 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1d440 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1d450 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1d460 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1d470 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1d480 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1d490 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1d4a0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1d4b0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1d4c0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1d4d0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1d4e0 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1d4f0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1d500 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1d510 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1d520 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1d530 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1d540 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d550 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1d560 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1d580 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1d590 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d5a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d5c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d5d0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1d5e0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1d5f0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1d600 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1d610 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1d620 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1d630 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1d640 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1d650 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1d660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d670 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d680 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d690 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1d6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1d6b0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1d6c0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1d6d0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1d6e0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1d6f0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1d700 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1d710 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1d720 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1d730 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1d740 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1d750 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1d760 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1d770 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1d780 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1d790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d7a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d7b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d7c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d7d0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1d7e0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1d7f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1d810 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1d820 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1d830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1d840 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1d850 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1d860 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1d870 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1d880 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1d890 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d8a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d8b0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1d8c0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1d8d0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1d8e0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d8f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d900 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1d910 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1d920 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1d930 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1d940 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1d950 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1d960 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1d970 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1d980 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1d990 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1d9a0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1d9b0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1d9c0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1d9d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1d9e0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1d9f0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1da00 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1da10 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1da20 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1da30 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1da40 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1da50 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1da60 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1da70 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1da80 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1da90 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1daa0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1dab0 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1dac0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1dad0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1dae0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1daf0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1db00 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1db10 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1db20 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1db30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1db40 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1db50 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1db60 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1db70 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1db80 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1db90 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1dba0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1dbb0 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1dbc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1dbd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1dbe0 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1dbf0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1dc00 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1dc10 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1dc20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1dc30 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1dc40 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1dc50 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1dc60 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1dc70 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1dc80 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1dc90 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1dca0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1dcb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1dcc0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1dcd0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1dce0 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1dcf0 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1dd00 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1dd10 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1dd20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1dd30 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1dd40 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1dd50 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1dd60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dd70 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1dd80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1dd90 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1dda0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1ddb0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1ddc0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1ddd0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1dde0 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1ddf0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1de00 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1de10 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1de20 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1de30 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1de40 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1de50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1de60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1de70 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1de80 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1de90 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1dea0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1deb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dec0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1ded0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1dee0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1def0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1df00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1df10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1df20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1df30 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1df40 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1df50 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1df60 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1df70 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1df80 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1df90 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1dfa0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1dfb0 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1dfc0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1dfd0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1dfe0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1dff0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1e000 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1e010 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1e020 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1e030 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1e040 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1e050 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1e060 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1e070 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1e080 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1e090 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1e0a0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e0b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e0c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e0d0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e0e0 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1e0f0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1e100 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1e110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e120 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e130 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1e140 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1e150 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1e160 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1e170 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1e180 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1e190 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1e1a0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1e1b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e1c0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1e1d0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1e1e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e1f0 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1e200 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1e210 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1e220 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1e230 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e240 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1e250 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1e260 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1e270 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1e280 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1e290 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1e2a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1e2b0 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1e2c0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1e2d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e2f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1e300 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1e310 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1e320 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1e330 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1e340 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1e350 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1e360 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1e370 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1e380 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1e390 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e3a0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1e3b0 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1e3c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e3d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1e3e0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1e3f0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1e400 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1e410 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1e420 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1e430 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1e440 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1e450 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1e460 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e470 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1e480 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1e490 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1e4a0 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1e4b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1e4c0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1e4d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1e4e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1e4f0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1e500 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1e510 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e530 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e540 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e550 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e570 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e580 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1e590 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1e5a0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1e5b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1e5c0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1e5d0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1e5e0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1e5f0 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1e600 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e610 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1e620 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1e630 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1e640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e680 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e690 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1e6a0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1e6b0 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1e6c0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1e6d0 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1e6e0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e6f0 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1e700 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1e710 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1e720 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1e730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e750 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1e760 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1e770 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1e780 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1e790 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1e7a0 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1e7b0 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1e7c0 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1e7d0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1e7e0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1e7f0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1e800 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1e810 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1e820 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1e830 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1e840 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1e850 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1e860 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1e870 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1e880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e890 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1e8a0 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1e8b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1e8c0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1e8d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e8e0 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1e8f0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1e900 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1e930 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1e940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1e950 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1e960 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1e970 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1e980 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1e990 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1e9a0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1e9b0 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1e9c0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1e9d0 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1e9e0 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1e9f0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1ea00 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1ea10 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1ea20 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1ea30 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1ea40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ea50 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1ea60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1ea70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1ea80 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1ea90 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1eaa0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1eab0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1eac0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1ead0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1eae0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1eaf0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1eb00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1eb10 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1eb20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1eb30 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1eb40 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1eb50 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1eb60 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1eb70 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1eb80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1eb90 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1eba0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1ebb0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1ebc0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1ebd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ebe0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1ebf0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1ec00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ec10 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1ec20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ec30 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1ec40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ec50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1ec60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ec70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1ec80 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1ec90 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1eca0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1ecb0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1ecc0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1ecd0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1ece0 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1ecf0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1ed00 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1ed10 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1ed20 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1ed30 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1ed40 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1ed50 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1ed60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ed70 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1ed80 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1ed90 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1eda0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1edb0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1edc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1edd0 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1ede0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1edf0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1ee00 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1ee10 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1ee20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1ee30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1ee40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ee60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1ee70 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1ee80 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1ee90 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1eea0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1eeb0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1eec0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1eed0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1eee0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1eef0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ef00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1ef10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1ef20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ef30 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1ef40 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ef50 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1ef60 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1ef70 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1ef80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1ef90 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1efa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1efb0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1efc0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1efd0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1efe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eff0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1f000 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1f010 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1f020 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1f030 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1f040 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1f050 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1f060 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1f070 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1f080 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f090 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1f0a0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1f0b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f0c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f0d0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1f0e0 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1f0f0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1f100 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1f110 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
1f120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1f140 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1f150 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1f160 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1f170 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1f180 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1f190 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1f1a0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1f1b0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1f1c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f1d0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1f1e0 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1f1f0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1f200 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f210 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1f220 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1f230 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1f240 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1f250 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1f260 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1f270 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1f280 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f290 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1f2a0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1f2b0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1f2c0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1f2d0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1f2e0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1f2f0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1f300 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f310 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1f320 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1f330 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1f340 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1f350 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1f360 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1f370 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f380 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1f390 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1f3a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1f3b0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1f3c0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1f3d0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1f3e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f3f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1f410 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1f420 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f430 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1f440 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1f450 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1f460 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1f470 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1f480 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f490 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1f4a0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1f4b0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1f4c0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1f4d0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1f4e0 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1f4f0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1f500 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1f510 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1f520 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1f530 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1f540 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1f550 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f560 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1f570 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1f580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f590 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1f5a0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1f5b0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1f5c0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f5d0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1f5e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f5f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f600 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1f610 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f620 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1f630 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1f640 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f650 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1f660 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1f670 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f690 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f6a0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1f6b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f6c0 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1f6d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1f6e0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1f6f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1f700 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1f710 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f720 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1f730 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1f740 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1f750 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f760 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1f770 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
1f780 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
1f790 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
1f7a0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
1f7b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1f7c0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
1f7d0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
1f7e0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
1f7f0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
1f800 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
1f810 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
1f820 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
1f830 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
1f840 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
1f850 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
1f860 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
1f870 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
1f880 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
1f890 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1f8a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1f8b0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1f8c0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1f8d0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1f8e0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1f8f0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1f900 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1f910 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1f920 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1f930 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1f940 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1f950 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1f960 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1f970 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1f980 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1f990 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1f9a0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1f9b0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1f9c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f9d0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1f9e0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1f9f0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fa00 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1fa10 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1fa20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1fa30 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1fa40 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1fa50 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1fa60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1fa70 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1fa80 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1fa90 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1faa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1fab0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1fac0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1fad0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1fae0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1faf0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1fb00 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1fb10 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1fb20 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1fb30 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1fb40 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1fb50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1fb60 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1fb70 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1fb80 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1fb90 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1fba0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1fbb0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1fbc0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1fbd0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1fbe0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1fbf0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1fc00 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1fc10 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1fc20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1fc30 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1fc40 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1fc50 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1fc60 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1fc70 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1fc80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1fc90 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1fca0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1fcb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1fcc0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1fcd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1fce0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
1fcf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1fd00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1fd10 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1fd20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1fd30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
1fd40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1fd50 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
1fd60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fd70 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1fd80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1fd90 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
1fda0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
1fdb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fdc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fdd0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1fde0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
1fdf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fe00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1fe10 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
1fe20 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
1fe30 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1fe40 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
1fe50 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
1fe60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1fe70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fe80 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1fe90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
1fea0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
1feb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fec0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1fed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1fee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1fef0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
1ff00 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
1ff10 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
1ff20 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
1ff30 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
1ff40 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1ff50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ff60 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1ff70 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
1ff80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ff90 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1ffa0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
1ffb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ffc0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1ffd0 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
1ffe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1fff0 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
20000 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
20010 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
20020 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
20030 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52  NE && db->nVdbeR
20040 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ead>1 ){.    /* 
20050 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
20060 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
20070 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
20080 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
20090 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
200a0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
200b0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
200c0 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
200d0 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
200e0 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
200f0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
20100 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
20110 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
20120 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20130 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
20140 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
20150 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
20160 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
20170 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
20180 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
20190 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
201a0 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
201b0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
201c0 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
201d0 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
201e0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
201f0 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
20200 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
20210 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
20220 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
20230 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
20240 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
20250 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
20260 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
20270 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
20280 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
20290 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
202a0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
202b0 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
202c0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
202d0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
202e0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
202f0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
20300 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
20310 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
20320 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20330 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
20340 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
20350 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
20360 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
20370 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
20380 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
20390 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
203a0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
203b0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
203c0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
203d0 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
203e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
203f0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
20400 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
20410 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
20420 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
20430 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
20440 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
20450 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
20460 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
20470 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
20480 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
20490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
204a0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
204b0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
204c0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
204d0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
204e0 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
204f0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
20500 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
20510 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
20520 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
20530 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
20540 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
20550 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
20560 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
20570 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
20580 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
20590 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
205a0 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
205b0 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
205c0 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
205d0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
205e0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
205f0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
20600 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
20610 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
20620 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
20630 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
20640 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
20650 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
20660 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
20670 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
20680 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
20690 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
206a0 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
206b0 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
206c0 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
206d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
206e0 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
206f0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
20700 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
20710 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
20720 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
20730 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
20740 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
20750 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
20760 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
20770 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
20780 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
20790 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
207a0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
207b0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
207c0 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
207d0 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
207e0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
207f0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
20800 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
20810 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
20820 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
20830 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
20840 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
20850 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
20860 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
20870 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
20880 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
20890 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
208a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
208b0 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
208c0 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
208d0 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
208e0 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
208f0 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
20900 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
20910 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
20920 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
20930 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20940 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20950 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
20960 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
20970 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
20980 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
20990 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
209a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
209b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
209c0 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
209d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
209e0 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
209f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
20a00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20a10 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
20a20 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
20a30 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
20a40 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
20a50 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
20a60 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
20a70 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
20a80 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
20a90 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
20aa0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
20ab0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
20ac0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20ad0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
20ae0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
20af0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
20b00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
20b10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
20b20 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
20b30 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
20b40 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
20b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20b60 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
20b70 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
20b80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20b90 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
20ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
20bb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20bc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20bd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
20be0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
20bf0 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
20c00 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
20c10 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
20c20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20c30 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
20c40 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
20c50 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
20c60 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
20c70 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
20c80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20c90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20ca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20cb0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
20cc0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
20cd0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
20ce0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
20cf0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
20d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20d10 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
20d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20d30 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
20d40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
20d60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
20d70 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
20d80 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
20d90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20da0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20db0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20dc0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
20dd0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
20de0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
20df0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
20e00 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
20e10 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
20e20 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
20e30 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
20e40 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
20e50 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
20e60 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
20e70 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
20e80 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
20e90 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
20ea0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
20eb0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
20ec0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
20ed0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
20ee0 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
20ef0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
20f00 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
20f10 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
20f20 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
20f30 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
20f40 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
20f50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20f60 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
20f70 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
20f80 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
20f90 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
20fa0 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
20fb0 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
20fc0 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
20fd0 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
20fe0 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
20ff0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
21000 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
21010 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
21020 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
21030 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
21040 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
21050 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
21060 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
21070 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
21080 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
21090 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
210a0 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
210b0 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
210c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
210d0 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
210e0 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
210f0 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
21100 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
21110 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21120 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
21130 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
21140 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
21150 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
21160 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
21170 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
21180 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
21190 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
211a0 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
211b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
211c0 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
211d0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
211e0 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
211f0 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
21200 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
21210 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
21220 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21230 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
21240 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
21250 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
21260 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
21270 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
21280 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
21290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
212a0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
212b0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
212c0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
212d0 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
212e0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
212f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21300 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
21310 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
21320 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
21330 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
21340 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
21350 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
21360 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
21370 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
21380 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
21390 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
213a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
213b0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
213c0 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
213d0 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
213e0 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
213f0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
21400 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21410 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
21420 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
21430 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21440 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
21450 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
21460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21480 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
21490 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
214a0 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
214b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
214c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
214d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
214e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
214f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21500 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
21510 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
21520 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
21530 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
21540 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
21550 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
21560 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
21570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21580 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
21590 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
215a0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
215b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
215c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
215d0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
215e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
215f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
21600 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
21610 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
21620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
21630 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
21640 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
21650 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
21660 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
21670 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
21680 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
21690 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
216a0 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
216b0 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
216c0 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
216d0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
216e0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
216f0 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
21700 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
21710 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
21720 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
21730 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
21740 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
21750 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
21760 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21770 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
21780 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
21790 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
217a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
217b0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
217c0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
217d0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
217e0 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
217f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21800 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
21810 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
21820 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
21830 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
21840 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21850 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
21860 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
21870 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
21880 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
21890 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
218a0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
218b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
218c0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
218d0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
218e0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
218f0 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
21900 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
21910 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
21920 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
21930 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
21940 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
21950 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
21960 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
21970 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
21980 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
21990 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
219a0 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
219b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
219c0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
219d0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
219e0 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
219f0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
21a00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
21a10 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
21a20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
21a30 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
21a40 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
21a50 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
21a60 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
21a70 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
21a80 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21a90 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
21aa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
21ab0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21ac0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
21ad0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
21ae0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
21af0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
21b00 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
21b10 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
21b20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
21b30 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
21b40 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
21b50 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
21b60 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
21b70 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
21b80 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
21b90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
21ba0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
21bb0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
21bc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
21bd0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
21be0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
21bf0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
21c00 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
21c10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
21c20 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
21c30 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
21c40 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
21c50 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
21c60 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
21c70 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
21c80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21c90 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
21ca0 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
21cb0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
21cc0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
21cd0 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
21ce0 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
21cf0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
21d00 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
21d10 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
21d20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
21d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21d40 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
21d50 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
21d60 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
21d70 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
21d80 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
21d90 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
21da0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
21db0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
21dc0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
21dd0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
21de0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
21df0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
21e00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
21e10 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
21e20 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
21e30 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
21e40 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
21e50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
21e60 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
21e70 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
21e80 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
21e90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
21ea0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
21eb0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
21ec0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
21ed0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
21ee0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
21ef0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
21f00 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
21f10 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
21f20 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
21f30 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
21f40 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
21f50 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
21f60 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
21f70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
21f80 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
21f90 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
21fa0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
21fb0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
21fc0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
21fd0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
21fe0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
21ff0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
22000 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
22010 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
22020 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
22030 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
22040 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
22050 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
22060 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
22070 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
22080 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
22090 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
220a0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
220b0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
220c0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
220d0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
220e0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
220f0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
22100 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
22110 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
22120 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22130 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
22140 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
22150 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
22160 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22170 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
22180 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
22190 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
221a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
221b0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
221c0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
221d0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
221e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
221f0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
22200 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22210 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
22220 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
22230 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
22240 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
22250 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
22260 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
22270 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
22280 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
22290 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
222a0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
222b0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
222c0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
222d0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
222e0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
222f0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
22300 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
22310 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
22320 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
22330 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
22340 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
22350 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
22360 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
22370 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
22380 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
22390 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
223a0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
223b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
223c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
223d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
223e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
223f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
22400 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
22410 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22420 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
22430 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
22440 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
22450 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
22460 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
22470 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
22480 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
22490 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
224a0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
224b0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
224c0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
224d0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
224e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
224f0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
22500 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
22510 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22520 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
22530 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
22540 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
22550 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
22560 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
22570 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
22580 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
22590 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
225a0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
225b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
225c0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
225d0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
225e0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
225f0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
22600 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
22610 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
22620 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
22630 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
22640 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
22650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
22660 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
22670 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
22680 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
22690 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
226a0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
226b0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
226c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
226d0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
226e0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
226f0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
22700 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
22710 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22720 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
22730 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
22740 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
22750 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
22760 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
22770 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22780 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
22790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
227a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
227b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
227c0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
227d0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
227e0 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
227f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22800 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
22810 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
22820 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
22830 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
22840 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
22850 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
22860 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22870 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
22880 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
22890 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
228a0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
228b0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
228c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
228d0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
228e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
228f0 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
22900 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
22910 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
22920 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
22930 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
22940 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
22950 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
22960 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
22970 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
22980 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
22990 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
229a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
229b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
229c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
229d0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
229e0 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
229f0 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
22a00 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
22a10 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
22a20 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
22a30 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
22a40 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
22a50 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
22a60 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
22a70 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
22a80 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
22a90 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
22aa0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
22ab0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
22ac0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
22ad0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
22ae0 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
22af0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
22b00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52  **.** If the BTR
22b10 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20  EE_WRCSR bit of 
22b20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  wrFlag is clear,
22b30 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
22b40 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20   can only.** be 
22b50 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
22b60 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  .  If the BTREE_
22b70 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74  WRCSR bit is set
22b80 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22b90 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  r.** can be used
22ba0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
22bb0 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f  for writing if o
22bc0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
22bd0 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61  for writing.** a
22be0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
22bf0 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64  ese are the cond
22c00 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
22c10 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
22c20 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20  .** for writing 
22c30 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  to be allowed:.*
22c40 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
22c50 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
22c60 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
22c70 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67  rFlag containing
22c80 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a   BTREE_WRCSR.**.
22c90 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
22ca0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22cb0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
22cc0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
22cd0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
22ce0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
22cf0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
22d00 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
22d10 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
22d20 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
22d30 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
22d40 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
22d50 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
22d60 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
22d70 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
22d80 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
22d90 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
22da0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
22db0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
22dc0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22dd0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
22de0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
22df0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
22e00 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
22e10 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
22e20 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
22e30 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
22e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45  ..**.** The BTRE
22e50 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20  E_FORDELETE bit 
22e60 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70  of wrFlag may op
22e70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20  tionally be set 
22e80 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  if BTREE_WRCSR.*
22e90 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f  * is set.  If FO
22ea0 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20  RDELETE is set, 
22eb0 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74  that is a hint t
22ec0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  o the implementa
22ed0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69  tion that.** thi
22ee0 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e  s cursor will on
22ef0 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65  ly be used to se
22f00 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65  ek to and delete
22f10 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69   entries of an i
22f20 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20  ndex.** as part 
22f30 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45  of a larger DELE
22f40 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  TE statement.  T
22f50 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e  he FORDELETE hin
22f60 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
22f70 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  .** this impleme
22f80 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e  ntation.  But in
22f90 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20   a hypothetical 
22fa0 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72  alternative stor
22fb0 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69  age engine .** i
22fc0 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e  n which index en
22fd0 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61  tries are automa
22fe0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
22ff0 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69  when correspondi
23000 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73  ng table.** rows
23010 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68   are deleted, th
23020 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67  e FORDELETE flag
23030 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20   is a hint that 
23040 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c  all SEEK and DEL
23050 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ETE.** operation
23060 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  s on this cursor
23070 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61   can be no-ops a
23080 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72  nd all READ oper
23090 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72  ations can .** r
230a0 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77  eturn a null row
230b0 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20   (2-bytes: 0x01 
230c0 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  0x00)..**.** No 
230d0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
230e0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
230f0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
23100 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
23110 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
23120 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
23130 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
23140 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
23150 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
23160 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
23170 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
23180 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
23190 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
231a0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
231b0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
231c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
231d0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
231e0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
231f0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
23200 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
23210 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
23220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23240 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
23250 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
23280 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
23290 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
232a0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
232d0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
232e0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
232f0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
23300 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23310 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
23320 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
23330 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
23360 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
23370 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
23380 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
233b0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
233c0 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
233f0 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
23400 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
23410 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
23420 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
23430 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23440 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  g==0 .       || 
23450 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52  wrFlag==BTREE_WR
23460 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  CSR .       || w
23470 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52  rFlag==(BTREE_WR
23480 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c  CSR|BTREE_FORDEL
23490 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ETE) .  );..  /*
234a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
234b0 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
234c0 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
234d0 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
234e0 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
234f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
23500 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
23510 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
23520 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
23530 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
23540 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
23550 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
23560 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
23570 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
23580 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
23590 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
235a0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
235b0 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
235c0 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f  nfo!=0, (wrFlag?
235d0 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72  2:1)) );.  asser
235e0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
235f0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
23600 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
23610 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
23620 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
23630 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
23640 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
23650 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
23660 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
23670 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
23680 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
23690 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
236a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
236b0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
236c0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
236d0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
236e0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
236f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
23700 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
23710 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
23720 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
23730 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
23740 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
23750 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
23760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23770 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
23780 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
23790 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
237a0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
237b0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
237c0 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
237d0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
237e0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
237f0 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
23800 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
23810 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
23820 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
23830 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
23840 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
23850 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
23860 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
23870 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
23880 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
23890 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
238a0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
238b0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
238c0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
238d0 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
238e0 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
238f0 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c  g ? BTCF_WriteFl
23900 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ag : 0;.  pCur->
23910 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
23920 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
23930 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
23940 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
23950 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
23960 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
23970 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
23980 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
23990 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
239a0 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
239b0 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
239c0 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
239d0 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
239e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
239f0 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
23a00 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
23a10 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
23a20 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
23a30 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
23a40 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
23a50 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
23a60 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
23a70 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
23a80 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
23a90 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
23aa0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23ab0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
23ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ad0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
23ae0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
23af0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
23b20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
23b30 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
23b60 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
23b70 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
23b80 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
23bb0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
23bc0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
23bd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
23c00 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
23c10 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c40 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
23c50 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
23c60 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
23c70 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
23c80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23c90 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
23ca0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
23cb0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
23cc0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
23cd0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
23ce0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
23cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23d00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
23d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
23d30 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
23d40 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
23d50 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
23d60 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
23d70 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
23d80 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
23d90 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
23da0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
23db0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
23dc0 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
23dd0 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
23de0 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
23df0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
23e00 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
23e10 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
23e20 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
23e30 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
23e40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23e50 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
23e60 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
23e70 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
23e80 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
23e90 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
23ea0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
23eb0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
23ec0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
23ed0 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
23ee0 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
23ef0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
23f00 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
23f10 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
23f20 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
23f30 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
23f40 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
23f50 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
23f60 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
23f70 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
23f80 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
23f90 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
23fa0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
23fb0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
23fc0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
23fd0 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
23fe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
23ff0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
24000 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
24010 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
24020 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
24030 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
24040 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
24050 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
24060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24070 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
24080 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
24090 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
240a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
240b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
240c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
240d0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
240e0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
240f0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
24100 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
24110 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24120 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
24130 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24140 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
24150 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
24160 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
24170 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
24180 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
24190 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
241a0 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
241b0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
241c0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
241d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
241e0 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
241f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
24200 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
24210 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
24220 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
24230 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
24240 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
24250 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24270 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
24280 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
24290 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
242a0 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
242b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
242c0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
242d0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
242e0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
242f0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
24300 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
24310 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
24320 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
24330 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
24340 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
24350 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
24360 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
24370 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
24380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
243a0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
243b0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
243c0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
243d0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
243e0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
243f0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
24400 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
24410 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
24420 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
24430 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
24440 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
24450 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
24460 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
24470 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
24480 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
24490 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
244a0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
244b0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
244c0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
244d0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
244e0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
244f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24500 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
24510 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
24520 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
24530 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
24540 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
24550 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
24560 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
24570 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
24580 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
24590 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
245a0 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
245b0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
245c0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
245d0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
245e0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
245f0 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
24600 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
24610 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
24620 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
24630 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24640 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
24650 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
24660 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
24670 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
24680 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
24690 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
246a0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
246b0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
246c0 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c 26 70  age],pCur->ix,&p
246d0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
246e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
246f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
24700 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
24710 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
24720 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
24730 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
24740 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
24750 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
24760 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
24770 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
24780 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
24790 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
247a0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
247b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
247c0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
247d0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
247e0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
247f0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
24800 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
24810 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
24820 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
24830 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24840 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
24850 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
24860 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
24870 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24880 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
24890 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
248a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
248b0 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
248c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
248d0 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
248e0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
248f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24900 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
24910 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
24920 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
24930 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
24940 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
24950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24960 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
24970 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
24980 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
24990 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
249a0 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
249b0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
249c0 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
249d0 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
249e0 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
249f0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
24a00 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
24a10 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
24a20 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
24a30 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24a40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24a50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24a70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24a80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
24a90 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
24aa0 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
24ab0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24ac0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24ad0 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nKey;.}../*.** R
24ae0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24af0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
24b00 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
24b10 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
24b20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
24b30 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
24b40 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
24b50 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
24b60 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
24b70 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
24b80 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
24b90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24ba0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
24bb0 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
24bc0 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
24bd0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
24be0 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
24bf0 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
24c00 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
24c10 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
24c20 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
24c30 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
24c40 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
24c50 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
24c60 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
24c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
24c80 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
24c90 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24ca0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24cb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24cc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24cd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24ce0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
24cf0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
24d00 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
24d10 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
24d20 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
24d30 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
24d40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
24d50 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
24d60 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
24d70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
24d80 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
24d90 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
24da0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
24db0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
24dc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
24dd0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
24de0 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
24df0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
24e00 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
24e10 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
24e20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
24e30 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
24e40 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
24e50 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
24e60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
24e70 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
24e80 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
24e90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
24ea0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
24eb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
24ec0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
24ed0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
24ee0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
24ef0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
24f00 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
24f10 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
24f20 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
24f30 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
24f40 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
24f50 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
24f60 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
24f70 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
24f80 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
24f90 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
24fa0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
24fb0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
24fc0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
24fd0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
24fe0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
24ff0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
25000 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
25010 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
25020 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
25030 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
25040 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
25050 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
25060 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
25070 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
25080 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
25090 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
250a0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
250b0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
250c0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
250d0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
250e0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
250f0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
25100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25120 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
25150 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
25160 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
25170 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
25180 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
25190 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
251a0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
251b0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
251c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
251d0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
251e0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
251f0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
25200 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
25210 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
25220 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25230 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25240 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25250 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25260 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
25270 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25280 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25290 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
252a0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
252b0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
252c0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
252d0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
252e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
252f0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
25300 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
25310 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
25320 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
25330 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
25340 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
25350 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
25360 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
25370 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
25380 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
25390 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
253a0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
253b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
253c0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
253d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
253e0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
253f0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
25400 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
25410 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
25420 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
25430 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
25440 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
25450 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25460 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
25470 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
25480 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
25490 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
254a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
254b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
254c0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
254d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
254e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
254f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
25500 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
25510 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
25520 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
25530 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25540 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
25550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
25560 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
25570 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
25580 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
25590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
255a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
255b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
255c0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
255d0 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
255e0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
255f0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
25600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
25610 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
25620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25630 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
25640 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
25650 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
25660 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
25670 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
25680 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
25690 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
256a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
256b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
256c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
256d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
256e0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
256f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
25700 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
25710 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
25720 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
25730 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
25740 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
25750 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
25760 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
25770 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
25780 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
25790 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
257a0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
257b0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
257c0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
257d0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
257e0 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
257f0 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
25800 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
25810 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
25820 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
25830 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
25840 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
25850 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
25860 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
25870 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
25880 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25890 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
258a0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
258b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
258c0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
258d0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
258e0 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
258f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
25900 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
25910 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
25920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25930 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
25940 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25960 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
25970 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
25980 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
25990 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
259a0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
259b0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
259c0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
259d0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
259e0 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
259f0 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
25a00 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
25a10 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
25a20 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
25a30 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
25a40 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
25a50 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25a60 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
25a70 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25a90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25aa0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
25ab0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
25ac0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
25ad0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
25ae0 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
25af0 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
25b00 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
25b10 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
25b20 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
25b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25b40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25b50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25b60 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
25b70 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
25b80 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
25b90 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
25ba0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
25bb0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25bc0 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
25bd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
25be0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
25bf0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
25c00 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
25c10 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
25c20 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25c30 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
25c40 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25c50 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
25c60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
25c70 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
25c80 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
25c90 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
25ca0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
25cb0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
25cc0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
25cd0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
25ce0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
25cf0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
25d00 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
25d10 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
25d20 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
25d30 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
25d40 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
25d50 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25d70 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
25d80 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
25d90 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
25da0 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
25db0 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
25dc0 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
25dd0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
25de0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
25df0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25e00 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
25e10 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
25e20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
25e30 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
25e40 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
25e50 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
25e60 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
25e70 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
25e80 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
25e90 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
25ea0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
25eb0 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
25ec0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
25ed0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
25ee0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
25ef0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
25f00 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
25f10 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
25f20 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
25f30 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
25f40 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25f50 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
25f60 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
25f70 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
25f80 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
25f90 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
25fa0 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
25fb0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
25fc0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
25fd0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
25fe0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
25ff0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
26000 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
26010 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
26020 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
26030 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
26040 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26050 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
26060 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
26070 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
26080 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
26090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
260a0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
260b0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
260c0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
260d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
260e0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
260f0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
26100 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
26110 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
26120 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
26130 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
26140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
26150 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
26160 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
26170 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
26180 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
26190 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
261a0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
261b0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
261c0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
261d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
261e0 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
261f0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
26200 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
26210 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
26220 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26230 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
26240 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
26250 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
26260 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26270 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
26280 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
26290 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
262a0 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
262b0 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
262c0 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
262d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
262e0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
262f0 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
26300 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
26310 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26320 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
26340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26350 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26360 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26370 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
26380 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
26390 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
263a0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
263b0 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
263c0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
263d0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
263e0 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
263f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
26400 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
26410 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
26420 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
26430 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
26440 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
26450 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
26460 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
26470 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
26480 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
26490 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
264a0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
264b0 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
264c0 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
264d0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
264e0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
264f0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
26500 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
26510 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
26520 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
26530 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
26540 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
26550 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
26560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26570 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
26580 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 20  e->pgno);.  }.. 
26590 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
265a0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
265b0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
265c0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
265d0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
265e0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
265f0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
26600 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
26610 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
26620 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
26630 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
26640 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
26650 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
26660 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
26670 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
26680 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
26690 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
266a0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
266b0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
266c0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
266d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
266e0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
266f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
26700 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
26710 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
26720 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
26730 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
26740 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
26750 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
26760 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
26770 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
26780 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
26790 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
267a0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
267b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
267c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
267d0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
267e0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
267f0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
26800 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
26810 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
26820 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
26830 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
26840 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
26850 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
26860 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
26870 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
26880 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
26890 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
268a0 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
268b0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
268c0 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
268d0 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
268e0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
268f0 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
26900 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
26910 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
26920 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
26930 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
26940 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26950 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
26960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
26970 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
26980 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
26990 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
269a0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
269b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
269c0 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
269d0 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
269e0 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
269f0 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
26a00 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
26a10 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
26a20 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
26a30 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
26a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
26a50 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
26a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26a70 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
26a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26a90 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
26aa0 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
26ab0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
26ac0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
26ad0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
26ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
26af0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
26b00 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
26b10 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
26b20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
26b30 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
26b40 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
26b50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
26b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
26b70 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
26b80 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
26b90 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
26ba0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
26bb0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
26bc0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
26bd0 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
26be0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
26bf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26c00 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
26c10 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
26c20 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
26c30 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
26c40 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
26c50 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
26c60 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26c70 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
26c80 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
26c90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
26ca0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
26cb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26cc0 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
26cd0 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
26ce0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
26cf0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
26d00 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
26d10 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
26d20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26d30 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26d40 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
26d50 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
26d60 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
26d70 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
26d80 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
26d90 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
26da0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26db0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
26dc0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
26dd0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
26de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
26df0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
26e00 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
26e10 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
26e20 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
26e30 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
26e40 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
26e50 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
26e60 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
26e70 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
26e80 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
26e90 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
26ea0 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
26eb0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
26ec0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
26ed0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
26ee0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
26ef0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
26f00 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
26f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26f20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
26f30 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26f40 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
26f50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26f60 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
26f70 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
26f80 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
26f90 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
26fa0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
26fb0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
26fc0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
26fd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26fe0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
26ff0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
27000 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
27010 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
27020 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
27030 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
27040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27050 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
27060 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
27070 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
27080 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
27090 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
270a0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
270b0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
270c0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
270d0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
270e0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
270f0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27100 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
27110 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27120 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  d;      /* File 
27130 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f  from which to do
27140 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77   direct overflow
27150 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
27160 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
27170 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
27180 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
27190 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
271a0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
271b0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
271c0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
271d0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
271e0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
271f0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
27200 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
27210 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
27220 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
27230 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
27240 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
27250 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
27260 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
27270 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
27280 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
27290 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
272a0 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69 73  **   3) there is
272b0 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
272c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
272d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
272e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
272f0 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
27300 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
27310 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
27320 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   in the WAL file
27330 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
27340 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
27350 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
27360 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
27370 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
27380 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27390 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
273a0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
273b0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
273c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
273d0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
273e0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
273f0 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
27400 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
27410 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
27420 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
27430 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
27440 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
27450 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
27460 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
27470 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
27480 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
274b0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
274c0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
27500 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
27510 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
27520 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
27550 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
27560 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
27570 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
27580 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20  hods     /* (4) 
27590 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  */.         && 0
275a0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73  ==sqlite3PagerUs
275b0 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  eWal(pBt->pPager
275c0 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20 20  , nextPage)     
275d0 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
275e0 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
275f0 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
27620 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
27630 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
27640 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
27650 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
27660 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
27670 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
27680 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
276b0 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
276c0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
276d0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
276e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
276f0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
27700 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
27710 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
27720 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
27730 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
27740 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
27750 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
27760 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
27770 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
27780 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
27790 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
277a0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
277b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
277c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
277d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
277e0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
277f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
27800 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
27810 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
27820 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
27830 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27850 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
27860 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
27870 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
27880 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27890 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
278a0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
278b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
278c0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
278d0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
278e0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
278f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27900 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
27910 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
27920 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
27930 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
27940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27950 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
27960 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
27970 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
27980 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
27990 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
279a0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
279b0 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
279c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
279d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
279e0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
279f0 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
27a00 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
27a10 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
27a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
27a30 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
27a40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
27a60 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
27a70 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
27a80 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
27a90 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
27aa0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
27ab0 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
27ac0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
27ad0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
27ae0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
27af0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27b00 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
27b10 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
27b20 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
27b30 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
27b40 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
27b50 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
27b60 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
27b70 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
27b80 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
27b90 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
27ba0 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
27bb0 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
27bc0 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
27bd0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
27be0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
27bf0 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
27c00 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
27c10 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
27c20 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
27c30 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
27c40 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
27c50 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
27c60 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
27c70 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
27c80 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
27c90 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
27ca0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
27cb0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
27cc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
27cd0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
27ce0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
27cf0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
27d00 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
27d10 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
27d20 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
27d30 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
27d40 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
27d50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d60 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
27d70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27d80 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
27d90 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27da0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27db0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27dd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27de0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
27df0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
27e00 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
27e10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27e30 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50  ur->ix<pCur->apP
27e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27e50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
27e60 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27e70 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27e80 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
27e90 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
27ea0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
27eb0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
27ec0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
27ed0 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
27ee0 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
27ef0 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
27f00 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
27f10 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
27f20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
27f30 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
27f40 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
27f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
27f60 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
27f70 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
27f80 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
27f90 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
27fa0 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
27fb0 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
27fc0 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
27fd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
27fe0 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
27ff0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28010 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28020 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28030 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28040 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
28050 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28060 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28070 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
28080 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
28090 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
280a0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
280b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
280c0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
280d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
280e0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
280f0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28100 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28110 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28120 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28130 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28140 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
28150 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28160 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28170 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
28180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28190 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
281a0 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
281b0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
281c0 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
281d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
281e0 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
281f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
28200 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
28210 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28220 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
28230 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
28240 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28250 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
28260 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
28270 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
28280 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
28290 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
282a0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
282b0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
282c0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
282d0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
282e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
282f0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28300 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28310 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28320 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28330 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28340 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28350 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28360 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28370 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
28380 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
28390 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
283a0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
283b0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
283c0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
283d0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
283e0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
283f0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
28400 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
28410 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28420 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
28430 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
28440 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
28450 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
28460 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
28470 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
28480 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
28490 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
284a0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
284b0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
284c0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
284d0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
284e0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
284f0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
28500 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28510 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
28520 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
28530 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
28540 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
28550 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28560 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
28570 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
28580 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
28590 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
285a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
285b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
285c0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
285d0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
285e0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
285f0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
28600 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
28610 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
28620 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
28630 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
28640 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
28650 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
28660 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
28670 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
28680 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
28690 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
286a0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
286b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
286c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
286d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
286e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
286f0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
28700 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
28710 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28720 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28740 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50  ur->ix<pCur->apP
28750 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28760 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
28770 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
28780 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
28790 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
287a0 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
287b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
287c0 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
287d0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
287e0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
287f0 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
28800 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28810 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
28820 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
28830 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
28840 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28850 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
28860 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
28870 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
28880 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
28890 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
288a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
288b0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
288c0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
288d0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
288e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
288f0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
28900 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
28910 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
28920 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
28930 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
28940 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
28950 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
28960 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
28970 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
28980 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
28990 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
289a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
289b0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
289c0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
289d0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
289e0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
289f0 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
28a00 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
28a10 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
28a20 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
28a30 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
28a40 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
28a50 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
28a60 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
28a70 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
28a80 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
28a90 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
28aa0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
28ab0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
28ac0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
28ad0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
28ae0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
28af0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
28b00 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
28b10 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
28b20 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
28b30 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
28b40 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
28b50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28b60 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
28b70 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
28b80 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
28b90 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28ba0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
28bb0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
28bc0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
28bd0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
28be0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28bf0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
28c00 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28c10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28c20 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28c30 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28c40 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
28c50 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
28c60 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
28c70 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
28c80 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
28c90 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
28ca0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
28cb0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
28cc0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
28cd0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
28ce0 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
28cf0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
28d00 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
28d10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28d20 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
28d30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28d40 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
28d50 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28d60 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28d80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28d90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28da0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28db0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
28dc0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
28dd0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28de0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
28df0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
28e00 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
28e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28e30 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
28e40 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28e50 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28e60 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28e70 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28e80 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
28e90 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 5d 20 3d  pCur->iPage++] =
28ea0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
28eb0 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 72 65 74  r->ix = 0;.  ret
28ec0 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
28ed0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
28ee0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
28ef0 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
28f20 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
28f30 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
28f40 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
28f50 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
28f60 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
28f70 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
28f80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
28f90 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
28fa0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
28fb0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
28fc0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
28fd0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
28fe0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
28ff0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
29000 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
29010 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
29020 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
29030 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
29040 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
29050 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
29060 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
29070 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
29080 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
29090 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
290a0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
290b0 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
290c0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
290d0 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
290e0 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
290f0 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
29120 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
29130 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
29140 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
29150 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
29160 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
29170 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
29180 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
29190 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
291a0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
291b0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
291c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
291d0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
291e0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
291f0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
29200 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
29210 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
29220 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
29230 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
29240 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
29250 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
29260 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
29270 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
29280 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
29290 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
292a0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
292b0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
292c0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
292d0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
292e0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
292f0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
29300 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
29310 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
29320 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
29330 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
29340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29350 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
29360 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29370 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29380 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29390 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
293a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
293b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
293c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
293d0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
293e0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
293f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29400 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29410 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
29420 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29430 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
29440 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29450 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
29460 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29470 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
29480 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
29490 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
294a0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
294b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
294c0 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
294d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
294e0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
294f0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
29500 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
29510 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
29520 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
29530 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29540 65 2d 31 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  e-1];.  releaseP
29550 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
29560 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29570 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
29580 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
29590 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
295a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
295b0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
295c0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
295d0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
295e0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
295f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
29600 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
29610 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
29620 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
29630 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
29640 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
29650 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
29660 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
29670 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
29680 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
29690 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
296a0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
296b0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
296c0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
296d0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
296e0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
296f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
29700 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
29710 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
29720 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
29730 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
29740 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
29750 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
29760 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
29770 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
29780 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
29790 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
297a0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
297b0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
297c0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
297d0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
297e0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
297f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
29800 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
29810 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
29820 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
29830 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
29840 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
29850 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
29860 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
29870 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
29880 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
29890 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
298a0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
298b0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
298c0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
298d0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
298e0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
298f0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
29900 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
29910 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
29920 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
29930 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
29940 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
29950 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
29960 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
29970 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
29980 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
29990 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
299a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
299b0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
299c0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
299d0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
299e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
299f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29a00 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29a10 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29a20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
29a30 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
29a40 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
29a50 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
29a60 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
29a70 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
29a80 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
29a90 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
29aa0 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
29ab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
29ac0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29ad0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29ae0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29af0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
29b00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
29b10 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
29b20 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
29b30 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
29b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29b50 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
29b60 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
29b70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
29b80 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e>=0 ){.    if( 
29b90 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
29ba0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
29bb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29bc0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29bd0 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e]!=0 );.       
29be0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
29bf0 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
29c00 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
29c10 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
29c20 70 43 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20  pCur->iPage);.  
29c30 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e      goto skip_in
29c40 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
29c50 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
29c60 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
29c70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29c80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29ca0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
29cb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29cc0 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
29cd0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
29ce0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
29cf0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
29d00 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
29d10 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
29d40 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
29d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29d60 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
29d70 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29d80 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
29d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29da0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
29db0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
29dc0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
29dd0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
29de0 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
29df0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
29e00 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
29e10 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
29e20 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
29e30 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
29e40 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
29e50 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
29e60 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
29e70 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
29e80 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
29e90 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
29ea0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
29eb0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
29ec0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
29ed0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
29ee0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
29ef0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
29f00 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
29f10 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
29f20 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
29f30 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
29f40 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
29f50 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
29f60 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
29f70 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
29f80 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
29f90 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
29fa0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
29fb0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
29fc0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
29fd0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
29fe0 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
29ff0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2a000 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2a010 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2a020 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2a030 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2a040 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2a050 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2a060 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2a070 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a080 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2a090 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2a0a0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2a0b0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2a0c0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2a0d0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2a0e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2a0f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a100 54 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50  T_PGNO(pCur->apP
2a110 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a120 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b  ->pgno);.  }..sk
2a130 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
2a140 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2a150 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a160 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2a170 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2a180 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
2a190 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a1a0 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
2a1b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2a1c0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
2a1d0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
2a1e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a1f0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
2a200 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
2a210 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
2a220 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
2a230 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
2a240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a250 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a260 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
2a270 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2a280 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2a290 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2a2a0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2a2b0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
2a2c0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2a2d0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
2a2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
2a2f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a300 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
2a310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a320 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a330 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2a340 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2a350 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2a360 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2a370 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2a380 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2a390 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2a3a0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2a3b0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2a3c0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2a3d0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2a3e0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2a3f0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2a400 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2a410 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2a420 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2a430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2a440 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2a450 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2a460 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2a470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a480 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a490 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2a4a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2a4b0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2a4c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a4d0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
2a4e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2a4f0 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2a500 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2a510 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2a520 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2a530 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2a540 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2a550 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2a560 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a570 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2a580 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2a590 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2a5a0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2a5b0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2a5c0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2a5d0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2a5e0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2a5f0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2a600 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2a610 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2a620 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2a630 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2a640 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2a650 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2a660 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2a670 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2a680 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2a690 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2a6a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2a6b0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2a6c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2a6d0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2a6e0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2a6f0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2a700 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2a710 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2a720 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2a730 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2a740 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2a750 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2a760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2a770 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2a780 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a790 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a7a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a7b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a7c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a7d0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2a7e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2a7f0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
2a800 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2a810 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2a820 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2a830 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2a840 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2a850 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2a860 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2a870 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2a880 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2a890 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2a8a0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2a8b0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2a8c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a8d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a8e0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a8f0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2a900 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2a910 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a920 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a930 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2a940 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2a950 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2a960 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2a970 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2a980 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2a990 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2a9a0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2a9b0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2a9c0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2a9d0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2a9e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2a9f0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2aa00 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2aa10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2aa20 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2aa30 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2aa40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2aa50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2aa60 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2aa70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2aa80 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2aa90 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2aaa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2aab0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2aac0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2aad0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2aae0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2aaf0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2ab00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ab10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2ab20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2ab30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2ab40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2ab50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ab60 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2ab70 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2ab80 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2ab90 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2aba0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2abb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2abc0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2abd0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2abe0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2abf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2ac00 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2ac10 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2ac20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2ac30 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2ac40 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2ac50 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2ac60 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ac70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2ac80 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2ac90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2aca0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2acb0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2acc0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2acd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ace0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2acf0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2ad00 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2ad10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ad20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2ad30 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2ad40 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2ad50 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2ad60 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2ad70 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2ad80 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ad90 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2ada0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2adb0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2adc0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2add0 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2ade0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2adf0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2ae00 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2ae10 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2ae20 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2ae30 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2ae40 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2ae50 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2ae60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ae70 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2ae80 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2ae90 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2aea0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aeb0 69 78 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ix==pCur->apPage
2aec0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2aed0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2aee0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2aef0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2af00 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2af10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2af20 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2af30 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2af40 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2af50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2af60 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2af70 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2af80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2af90 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2afa0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2afb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2afc0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2afd0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2afe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2aff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b000 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b010 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2b020 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2b030 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2b040 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2b050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b060 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2b070 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2b080 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2b090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2b0a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b0b0 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2b0c0 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2b0d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b0e0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2b0f0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2b100 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2b110 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2b120 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2b130 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2b140 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2b150 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2b160 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2b170 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2b180 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2b190 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2b1a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2b1b0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2b1c0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2b1d0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2b1e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2b1f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2b200 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2b210 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2b220 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2b230 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2b240 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2b250 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2b260 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2b270 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2b280 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2b290 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2b2a0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2b2b0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2b2c0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2b2d0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2b2e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2b2f0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2b300 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2b310 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2b320 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2b330 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2b340 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2b350 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2b360 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2b370 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2b380 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2b390 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2b3a0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2b3b0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2b3c0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2b3d0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2b3f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2b400 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2b410 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2b420 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2b430 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2b440 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2b450 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2b460 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2b470 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2b480 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2b490 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b4a0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2b4b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b4c0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2b4d0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2b4e0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2b4f0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2b500 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2b510 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2b520 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2b530 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2b540 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2b550 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2b560 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2b570 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2b580 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2b590 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2b5a0 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2b5b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2b5c0 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2b5d0 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2b5e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2b5f0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2b600 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2b610 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2b620 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2b630 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2b640 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2b650 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2b660 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2b670 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2b680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b690 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2b6a0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2b6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2b6c0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2b6d0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2b6e0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2b6f0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2b700 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2b710 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2b720 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2b730 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2b740 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2b750 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2b760 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b770 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b780 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b790 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2b7a0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2b7b0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2b7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2b7d0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2b7e0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2b7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b800 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2b810 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2b820 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2b830 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2b840 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2b850 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2b860 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2b870 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2b880 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2b890 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2b8a0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2b8b0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2b8c0 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2b8d0 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2b8e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2b8f0 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2b900 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2b910 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2b920 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2b930 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2b940 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2b950 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2b960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b970 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2b980 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2b990 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
2b9a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2b9b0 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2b9c0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2b9d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72   = -1;.        r
2b9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b9f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2ba00 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2ba10 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f  ed key is one mo
2ba20 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  re than the prev
2ba30 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20  ious key, then. 
2ba40 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67       ** try to g
2ba50 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73  et there using s
2ba60 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ba70 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  ) rather than a 
2ba80 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69  full.      ** bi
2ba90 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68  nary search.  Th
2baa0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2bab0 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65  ation only.  The
2bac0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a   correct answer.
2bad0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2bae0 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  l obtained witho
2baf0 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e  ut this case, on
2bb00 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ly a little more
2bb10 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20   slowely */.    
2bb20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2bb30 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20  .nKey+1==intKey 
2bb40 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65  && !pCur->skipNe
2bb50 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  xt ){.        *p
2bb60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2bb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2bb80 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2bb90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2bba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bbb0 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2bbc0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2bbd0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2bbe0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2bbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bc00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bc10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bc20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bc30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2bc40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2bc50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bc70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bc80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bc90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2bca0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2bcb0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2bcc0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2bcd0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2bce0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2bcf0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2bd00 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2bd10 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2bd20 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2bd30 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2bd40 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2bd50 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2bd60 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2bd70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2bd80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2bd90 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2bda0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2bdb0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2bdc0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2bdd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2bde0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2bdf0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2be00 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2be10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2be20 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2be30 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2be40 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2be50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2be60 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2be70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2be80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2be90 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2bea0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2beb0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2bec0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2bed0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2bee0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2bef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2bf00 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2bf10 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2bf20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2bf30 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2bf40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bf50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2bf60 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2bf70 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2bf80 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2bf90 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2bfa0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2bfb0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2bfc0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2bfd0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2bfe0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2bff0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2c000 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c010 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2c020 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2c050 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2c060 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2c070 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2c080 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2c090 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2c0a0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2c0b0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2c0c0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2c0d0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2c0e0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2c0f0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2c100 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2c110 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2c120 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2c130 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2c140 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2c150 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2c160 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2c170 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2c180 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2c190 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2c1a0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2c1b0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2c1c0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2c1d0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2c1e0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2c1f0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2c200 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2c210 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2c220 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c230 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2c240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c250 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2c260 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2c270 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2c280 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2c290 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2c2a0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2c2b0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2c2c0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2c2d0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2c2e0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2c2f0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2c300 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2c310 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c320 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2c330 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2c340 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2c350 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2c360 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2c370 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2c380 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2c390 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2c3a0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2c3b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2c3c0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2c3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c3e0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2c3f0 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2c400 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2c410 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2c420 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
2c430 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  no);.           
2c440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2c450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c460 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2c470 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2c480 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2c490 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2c4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2c4b0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2c4c0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2c4d0 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2c4e0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2c4f0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2c500 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2c510 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c520 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2c530 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2c540 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2c550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c560 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2c570 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2c580 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2c590 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2c5a0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2c5b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c5c0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2c5d0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2c5e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2c5f0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2c600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c610 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2c620 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2c630 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2c640 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2c650 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2c660 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c670 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c680 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2c690 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2c6a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c6b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2c6c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c6d0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2c6e0 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2c6f0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c700 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2c710 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2c720 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c730 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2c740 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2c750 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2c760 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2c770 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2c780 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c790 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2c7a0 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
2c7b0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2c7c0 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
2c7d0 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
2c7e0 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
2c7f0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
2c800 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
2c810 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
2c820 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
2c830 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
2c840 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
2c850 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
2c860 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
2c870 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
2c880 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
2c890 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
2c8a0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
2c8b0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
2c8c0 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
2c8d0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2c8e0 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
2c8f0 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
2c900 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
2c910 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
2c920 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
2c930 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
2c940 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
2c950 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
2c960 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
2c970 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
2c980 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2c990 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
2c9a0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
2c9b0 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
2c9c0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
2c9d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2c9e0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
2c9f0 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
2ca00 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
2ca10 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
2ca20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
2ca30 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2ca40 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
2ca50 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2ca60 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
2ca70 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2ca80 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2ca90 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2caa0 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
2cab0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2cac0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2cad0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2cae0 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
2caf0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2cb00 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
2cb10 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
2cb20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
2cb30 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
2cb40 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
2cb50 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
2cb60 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
2cb70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2cb80 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2cb90 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
2cba0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2cbb0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
2cbc0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2cbd0 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
2cbe0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2cbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cc00 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
2cc10 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2cc20 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2cc30 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2cc40 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2cc50 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
2cc60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cc70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2cc80 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
2cc90 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
2cca0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2ccb0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
2ccc0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
2ccd0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
2cce0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
2ccf0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
2cd00 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
2cd10 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
2cd20 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
2cd30 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
2cd40 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
2cd50 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
2cd60 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
2cd70 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
2cd80 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
2cd90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2cda0 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
2cdb0 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
2cdc0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2cdd0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
2cde0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
2cdf0 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
2ce00 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2ce10 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
2ce20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
2ce30 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
2ce40 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
2ce50 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
2ce60 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
2ce70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
2ce80 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
2ce90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
2cea0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
2ceb0 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
2cec0 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
2ced0 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
2cee0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
2cef0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2cf00 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2cf10 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2cf20 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2cf30 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2cf40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2cf50 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2cf60 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2cf70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2cf80 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2cf90 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2cfa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2cfb0 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2cfc0 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2cfd0 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2cfe0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2cff0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2d000 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2d010 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2d020 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2d030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2d040 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2d050 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2d060 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2d070 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2d080 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
2d090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d0a0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
2d0b0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
2d0c0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d0d0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2d0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d0f0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2d100 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2d110 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2d120 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2d130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d150 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2d160 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d170 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2d180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2d190 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2d1a0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2d1b0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2d1c0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2d1d0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2d1e0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2d1f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2d200 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2d210 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2d220 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2d230 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d240 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2d250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2d260 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d270 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d280 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2d290 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2d2a0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2d2b0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2d2c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2d2d0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2d2e0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2d2f0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2d300 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2d310 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2d320 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2d330 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2d340 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2d350 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2d360 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2d370 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2d380 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2d390 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2d3a0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2d3b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2d3c0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2d3d0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2d3e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d3f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d400 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2d410 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d420 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d430 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d440 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2d450 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2d460 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2d470 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2d480 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2d490 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d4a0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2d4b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d4c0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2d4d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d4e0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2d4f0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2d500 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2d510 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2d520 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2d530 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2d540 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2d550 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2d560 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2d570 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d580 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2d590 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2d5a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d5b0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2d5c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d5d0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2d5e0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d5f0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2d600 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2d610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d620 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d630 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2d640 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d650 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2d660 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d670 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2d680 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2d690 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2d6a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2d6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2d6c0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2d6d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2d6e0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2d6f0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2d700 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2d710 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2d720 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2d730 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2d740 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2d750 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d760 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
2d770 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2d780 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2d790 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
2d7a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d7b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2d7c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2d7d0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2d7e0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2d7f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2d800 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2d810 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2d820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2d830 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2d840 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2d850 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2d860 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2d870 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2d880 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2d890 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2d8a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2d8b0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2d8c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2d8d0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2d8e0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2d8f0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2d900 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2d910 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2d920 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2d930 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2d940 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2d950 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2d960 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2d970 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2d980 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2d990 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2d9a0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2d9b0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2d9c0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2d9d0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2d9e0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
2d9f0 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
2da00 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2da10 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
2da20 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
2da30 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
2da40 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2da50 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
2da60 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
2da70 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
2da80 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
2da90 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
2daa0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
2dab0 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
2dac0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2dad0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2dae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2daf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2db00 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2db10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2db20 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
2db30 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
2db40 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
2db50 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
2db60 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
2db70 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
2db80 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
2db90 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
2dba0 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
2dbb0 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
2dbc0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
2dbd0 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
2dbe0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2dbf0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
2dc00 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2dc10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2dc20 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29 20 29  age]->leaf==0) )
2dc30 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 66   return -1;..  f
2dc40 6f 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d  or(n=1, i=0; i<=
2dc50 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
2dc60 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
2dc70 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
2dc80 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
2dc90 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
2dca0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2dcb0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2dcc0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2dcd0 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
2dce0 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
2dcf0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
2dd00 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
2dd10 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
2dd20 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2dd30 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
2dd40 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
2dd50 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2dd60 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2dd70 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2dd80 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2dd90 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2dda0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2ddb0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2ddc0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2ddd0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2dde0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2ddf0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2de00 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2de10 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2de20 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2de30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2de40 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2de50 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2de60 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2de70 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2de80 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2de90 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2dea0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2deb0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2dec0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
2ded0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2dee0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2def0 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 20 63  is 1, then the c
2df00 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2df10 73 20 74 6f 0a 2a 2a 20 61 6e 20 53 51 4c 20 69  s to.** an SQL i
2df20 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2df30 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2df40 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2df50 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 0a 2a   the SQL index.*
2df60 2a 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  * had been a uni
2df70 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2df80 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2df90 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2dfa0 69 6d 70 6c 65 6d 65 6e 74 2e 0a 2a 2a 20 53 51  implement..** SQ
2dfb0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dfc0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2dfd0 6f 74 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ot use this hint
2dfe0 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2dff0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2e000 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2e010 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2e020 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
2e030 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
2e040 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2e050 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2e060 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e070 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e080 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e090 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2e0a0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e0b0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2e0c0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2e0d0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2e0e0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e0f0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2e100 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2e110 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2e120 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2e130 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2e140 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2e150 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2e160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e170 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2e190 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2e1a0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e1b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e1c0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2e1d0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2e1e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2e1f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2e200 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2e210 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e220 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2e230 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2e240 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e250 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2e260 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e270 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2e280 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2e290 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e2b0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2e2c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e2d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2e2e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e2f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e300 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78  idx = ++pCur->ix
2e310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2e320 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2e330 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2e340 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2e350 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2e360 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2e370 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2e380 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2e390 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2e3a0 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2e3b0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2e3c0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2e3d0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2e3e0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2e3f0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2e400 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2e410 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2e420 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2e430 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2e440 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2e450 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2e460 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2e470 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2e480 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2e490 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2e4a0 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2e4b0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2e4c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2e4d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2e4e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2e4f0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2e500 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e510 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e520 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2e530 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e540 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e550 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e560 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2e570 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2e580 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2e590 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e5a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2e5b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e5c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2e5d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2e5e0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2e5f0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2e600 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e610 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2e620 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
2e630 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e640 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2e650 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2e660 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2e670 65 4e 65 78 74 28 70 43 75 72 2c 20 66 6c 61 67  eNext(pCur, flag
2e680 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2e690 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e6a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2e6b0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2e6c0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2e6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2e6e0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2e6f0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2e700 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2e710 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2e720 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2e730 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d   int flags){.  M
2e740 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2e750 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e760 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e770 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2e780 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2e790 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2e7a0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2e7b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e7c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e7d0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2e7e0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2e7f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e800 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2e810 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2e820 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e830 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e840 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2e850 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2e860 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e870 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e880 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2e890 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
2e8a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2e8b0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
2e8c0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2e8d0 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ur, 0);.  }.  if
2e8e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e8f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e900 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2e910 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e920 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e930 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2e940 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2e950 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2e960 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2e970 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2e980 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2e990 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
2e9a0 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65  ITE_OK     succe
2e9b0 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ss.**     SQLITE
2e9c0 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73  _DONE   the curs
2e9d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e  or is already on
2e9e0 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
2e9f0 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  nt of the table.
2ea00 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65  **     otherwise
2ea10 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f       some kind o
2ea20 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  f error occurred
2ea30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2ea40 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2ea50 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2ea60 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2ea70 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2ea80 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2ea90 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2eaa0 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2eab0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2eac0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2ead0 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2eae0 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2eaf0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2eb00 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2eb10 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2eb20 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2eb30 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2eb40 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2eb50 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2eb60 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2eb70 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2eb80 73 6f 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 66  sor..**.**.** If
2eb90 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2eba0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2ebb0 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 20 63  is 1, then the c
2ebc0 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2ebd0 73 20 74 6f 0a 2a 2a 20 61 6e 20 53 51 4c 20 69  s to.** an SQL i
2ebe0 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2ebf0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2ec00 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2ec10 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 0a 2a   the SQL index.*
2ec20 2a 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  * had been a uni
2ec30 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2ec40 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2ec50 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2ec60 69 6d 70 6c 65 6d 65 6e 74 2e 0a 2a 2a 20 53 51  implement..** SQ
2ec70 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2ec80 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2ec90 6f 74 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ot use this hint
2eca0 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2ecb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2ecc0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2ecd0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2ece0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2ecf0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
2ed00 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2ed10 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2ed20 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2ed30 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2ed40 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2ed50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ed60 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2ed70 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2ed80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ed90 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2eda0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2edb0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2edc0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2edd0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2ede0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2edf0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2ee00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2ee10 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ee20 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2ee30 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2ee40 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2ee50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ee60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ee70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2ee80 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2ee90 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2eea0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2eeb0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2eec0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2eed0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2eee0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2eef0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ef00 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2ef10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2ef20 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2ef30 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2ef40 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2ef50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2ef60 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20  pNext<0 ){.     
2ef70 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2ef80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2ef90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2efa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2efb0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2efc0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2efd0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2efe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2eff0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2f000 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2f010 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2f020 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
2f030 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20  = pCur->ix;.    
2f040 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2f050 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2f060 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2f070 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
2f080 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f090 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2f0a0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2f0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
2f0c0 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20  le( pCur->ix==0 
2f0d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2f0e0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2f0f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
2f100 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2f110 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
2f120 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
2f130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f140 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2f150 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2f160 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2f170 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2f180 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f190 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2f1a0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2f1b0 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78  );..    pCur->ix
2f1c0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2f1d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f1e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2f1f0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2f200 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2f210 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f220 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2f230 6f 75 73 28 70 43 75 72 2c 20 66 6c 61 67 73 29  ous(pCur, flags)
2f240 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f260 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2f270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2f280 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f290 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2f2a0 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
2f2b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2f2c0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2f2d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2f2e0 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
2f2f0 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  gs==1 );.  asser
2f300 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2f310 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2f320 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f330 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75  ID );.  pCur->cu
2f340 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f350 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2f360 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2f370 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2f380 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2f390 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f3a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f3b0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
2f3c0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2f3d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f3e0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2f3f0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2f400 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2f410 30 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  0);.  }.  pCur->
2f420 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  ix--;.  return S
2f430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2f440 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
2f450 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
2f460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2f470 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
2f480 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
2f490 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2f4a0 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2f4b0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2f4c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2f4d0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2f4e0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2f4f0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2f500 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2f510 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2f520 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2f530 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2f540 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2f550 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2f560 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2f570 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2f580 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2f590 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2f5a0 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2f5b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2f5c0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2f5d0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
2f5e0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
2f5f0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
2f600 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
2f610 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2f620 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2f630 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2f640 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2f650 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2f660 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2f670 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2f680 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2f690 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2f6a0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2f6b0 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2f6c0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2f6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f6e0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2f6f0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2f700 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2f710 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2f720 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2f730 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2f740 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2f750 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2f760 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2f770 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2f780 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2f790 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2f7a0 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2f7b0 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2f7c0 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2f7d0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2f7e0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2f7f0 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2f800 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2f810 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2f820 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2f830 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2f840 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2f850 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2f860 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2f870 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2f880 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2f890 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2f8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2f8b0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2f8c0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2f8d0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2f8e0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2f8f0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2f900 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2f910 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2f920 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2f930 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2f940 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2f950 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2f960 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2f970 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f990 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2f9a0 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2f9b0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2f9c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2f9d0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2f9e0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2f9f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2fa00 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2fa10 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2fa20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2fa30 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2fa40 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2fa50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2fa60 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2fa70 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2fa80 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2fa90 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2faa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2fab0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2fac0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2fad0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2fae0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2faf0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2fb00 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2fb10 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2fb20 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2fb30 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2fb40 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2fb50 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2fb60 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2fb70 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2fb80 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2fb90 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2fba0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2fbb0 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2fbc0 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2fbd0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2fbe0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2fbf0 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2fc00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2fc10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2fc20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2fc30 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2fc40 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2fc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fc60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fc70 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2fc80 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2fc90 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2fca0 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2fcb0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2fcc0 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2fcd0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2fce0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2fcf0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2fd00 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2fd10 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2fd20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72  */.    u32 nSear
2fd30 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75  ch = 0;   /* Cou
2fd40 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
2fd50 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d   of search attem
2fd60 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  pts */.    .    
2fd70 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
2fd80 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
2fd90 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
2fda0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
2fdb0 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
2fdc0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2fdd0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
2fde0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2fdf0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
2fe00 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
2fe10 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2fe20 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
2fe30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2fe40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2fe50 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2fe60 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
2fe70 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
2fe80 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
2fe90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2fea0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
2feb0 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
2fec0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
2fed0 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
2fee0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
2fef0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
2ff00 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
2ff10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ff20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ff30 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
2ff40 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2ff50 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2ff60 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
2ff70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
2ff80 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
2ff90 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2ffa0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2ffb0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2ffc0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
2ffd0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
2ffe0 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
2fff0 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
30000 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
30010 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
30020 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
30030 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
30040 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
30050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30060 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
30070 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
30080 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30090 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
300a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
300b0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
300c0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
300d0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
300e0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
300f0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
30100 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
30110 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
30120 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
30130 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
30140 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
30150 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
30160 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
30170 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
30180 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
30190 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
301a0 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
301b0 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
301c0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
301d0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
301e0 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
301f0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
30200 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
30210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
30220 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
30230 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
30240 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
30250 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
30260 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
30270 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
30280 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
30290 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
302a0 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
302b0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
302c0 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
302d0 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
302e0 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
302f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
30300 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
30310 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30320 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
30330 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
30340 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
30350 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
30360 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
30370 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
30380 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
30390 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
303a0 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
303b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
303c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
303d0 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
303e0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
303f0 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
30400 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
30410 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
30420 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30430 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
30440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30450 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
30460 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
30470 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
30480 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
30490 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
304a0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
304b0 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65  PrevTrunk ? pPre
304c0 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31  vTrunk->pgno : 1
304d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
304e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
304f0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
30500 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
30510 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
30520 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
30530 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
30540 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
30550 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30560 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
30570 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
30580 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
30590 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
305a0 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
305b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
305c0 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
305d0 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
305e0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
305f0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
30600 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
30610 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
30620 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
30630 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
30640 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
30650 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
30660 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
30670 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
30680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
30690 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
306a0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
306b0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
306c0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
306d0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
306e0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
306f0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
30700 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
30710 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
30720 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
30730 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
30740 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
30750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30760 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
30770 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30780 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
30790 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
307a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
307b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
307c0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
307d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
307e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
307f0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
30800 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
30810 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
30820 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
30830 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
30840 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
30850 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
30860 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
30870 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
30880 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
30890 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
308a0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
308b0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
308c0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
308d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
308e0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
308f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
30900 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30910 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
30920 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30930 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
30940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30950 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
30970 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30980 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
30990 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
309a0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
309b0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
309c0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
309d0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
309e0 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
309f0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
30a00 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
30a10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
30a20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
30a30 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
30a40 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
30a50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30a60 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
30a70 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
30a80 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
30a90 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30aa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
30ab0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30ac0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30ad0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
30ae0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30af0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30b00 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30b10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30b20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
30b30 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
30b40 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
30b50 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
30b60 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
30b70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
30b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30bb0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
30bc0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30bd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
30be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30c00 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30c10 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
30c20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
30c30 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
30c40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
30c50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30c70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30c80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
30c90 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
30ca0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
30cb0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
30cc0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
30cd0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
30ce0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
30cf0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
30d00 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
30d10 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
30d20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
30d30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30d40 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
30d50 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
30d60 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
30d70 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30d80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
30d90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30da0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
30db0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
30dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30dd0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
30de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
30df0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30e00 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
30e10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
30e20 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
30e30 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
30e40 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
30e50 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30e60 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
30e70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
30e80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ea0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30eb0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30ed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30ee0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
30ef0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
30f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
30f30 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
30f40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
30f50 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30f60 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f80 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
30f90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
30fa0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30fb0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
30fc0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
30fd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
30fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
30ff0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
31000 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
31010 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
31020 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
31030 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
31040 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31050 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
31060 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
31070 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
31080 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31090 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
310a0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
310b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
310c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
310d0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
310e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
310f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31100 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31110 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
31120 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31130 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31140 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31150 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31170 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
31180 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
31190 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
311a0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
311b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
311c0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
311d0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
311e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
311f0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
31200 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
31210 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
31220 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
31230 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
31240 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
31250 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
31260 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
31270 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
31280 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
31290 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
312a0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
312b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
312c0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
312d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
312e0 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
312f0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
31300 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
31310 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
31320 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
31330 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
31340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31350 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
31360 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
31380 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
31390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
313a0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
313b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
313d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
313e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
313f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31400 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
31410 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
31420 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
31430 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
31440 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
31450 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
31460 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
31470 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
31480 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
31490 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
314a0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
314b0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
314c0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
314d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
314e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
314f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31500 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
31510 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31520 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31550 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
31560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
31570 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
31580 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
31590 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
315a0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
315b0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
315c0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
315d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
315e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
315f0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
31600 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
31610 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31620 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
31630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31640 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
31650 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
31660 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
31670 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
31680 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
31690 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
316a0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
316b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
316c0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
316d0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
316e0 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
316f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31700 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
31710 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
31720 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
31730 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
31740 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
31750 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31760 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
31770 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
31780 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
31790 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
317a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
317b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
317c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
317d0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
317e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
317f0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
31800 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
31810 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31820 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
31830 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
31840 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31850 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
31860 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
31870 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
31880 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
31890 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
318a0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
318b0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
318c0 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
318d0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
318e0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
318f0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
31900 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
31910 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31940 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
31950 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
31960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31990 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
319a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
319b0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
319c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
319d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
319e0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
319f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
31a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
31a10 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
31a20 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
31a30 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
31a40 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
31a50 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
31a60 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
31a70 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
31a80 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
31a90 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
31aa0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
31ab0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
31ac0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
31ad0 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
31ae0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
31af0 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
31b00 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
31b10 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
31b20 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
31b30 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
31b40 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
31b50 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
31b60 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
31b70 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
31b80 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
31b90 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
31ba0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
31bb0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
31bc0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
31bd0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
31be0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
31bf0 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
31c00 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
31c10 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
31c20 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
31c30 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
31c40 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
31c50 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
31c60 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
31c70 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
31c80 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
31c90 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
31ca0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
31cb0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
31cc0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
31cd0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
31ce0 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
31cf0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
31d00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31d10 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
31d20 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
31d30 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
31d40 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
31d50 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
31d60 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
31d70 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
31d80 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
31d90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
31da0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
31db0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
31dc0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
31dd0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
31de0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
31df0 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
31e00 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
31e10 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
31e20 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
31e30 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31e40 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
31e50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
31e60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31e70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
31e80 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
31e90 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
31ea0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
31eb0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
31ec0 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
31ed0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31ee0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
31ef0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31f00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31f10 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
31f20 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
31f30 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
31f40 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
31f50 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
31f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31f70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31f80 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31f90 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
31fa0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
31fb0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
31fc0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
31fd0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
31fe0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
31ff0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
32000 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
32010 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
32020 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
32030 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
32040 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
32050 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
32060 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
32070 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
32080 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
32090 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
320a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
320b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
320c0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
320d0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
320e0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
320f0 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
32100 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
32110 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
32120 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
32130 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
32140 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
32150 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
32160 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
32170 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
32180 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
321a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
321b0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
321c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
321d0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
321e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
321f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32200 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
32210 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
32220 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
32230 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32240 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
32250 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
32260 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
32270 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
32280 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
32290 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
322a0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
322b0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
322c0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
322d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
322e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
322f0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
32300 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
32310 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
32320 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32330 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
32340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32350 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
32360 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
32370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32380 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
32390 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
323a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
323b0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
323c0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
323d0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
323e0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
323f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
32400 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
32410 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
32420 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
32430 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
32440 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
32450 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
32460 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
32470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32480 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
32490 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
324a0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
324b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
324c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
324d0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
324e0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
324f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
32500 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
32510 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
32520 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
32530 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
32540 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
32550 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
32560 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
32570 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
32580 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
32590 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
325a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
325b0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
325c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
325d0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
325e0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
325f0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
32600 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
32610 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
32620 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
32630 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
32640 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
32650 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
32660 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
32670 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
32680 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
32690 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
326a0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
326b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
326c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
326d0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
326e0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
326f0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
32700 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
32710 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
32720 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
32730 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
32740 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
32750 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
32760 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32770 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
32780 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
32790 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
327a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
327b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
327c0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
327d0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
327e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
327f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
32800 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
32810 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32820 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
32830 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
32840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32850 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
32860 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
32870 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32890 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
328a0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
328b0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
328c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
328d0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
328e0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
328f0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
32900 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32910 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
32920 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
32930 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
32940 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
32950 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
32960 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
32970 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
32980 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
32990 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
329a0 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
329b0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
329c0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
329d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
329e0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
329f0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
32a00 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
32a10 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
32a20 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
32a30 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
32a40 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
32a50 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
32a60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32a70 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
32a80 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
32a90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32aa0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
32ab0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32ac0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
32ad0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32ae0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
32af0 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
32b00 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
32b10 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
32b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
32b30 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
32b40 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
32b50 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
32b60 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
32b70 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
32b80 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
32b90 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
32ba0 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
32bb0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
32bc0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
32bd0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
32be0 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
32bf0 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
32c00 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
32c10 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
32c20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
32c30 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32c40 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
32c50 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
32c60 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
32c70 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
32c80 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32c90 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
32ca0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
32cb0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
32cc0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
32cd0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
32ce0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
32cf0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
32d00 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
32d10 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
32d20 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
32d30 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
32d40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
32d50 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32d60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
32d70 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
32d80 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
32d90 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
32da0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
32db0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
32dc0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
32dd0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
32de0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
32df0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
32e00 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32e10 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
32e20 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
32e30 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
32e40 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
32e50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
32e60 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
32e70 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
32e80 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
32e90 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
32ea0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
32eb0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
32ec0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
32ed0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
32ee0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
32ef0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
32f00 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
32f10 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
32f20 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32f40 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32f50 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
32f60 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
32f70 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
32f80 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32f90 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
32fa0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32fb0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
32fc0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
32fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32fe0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32ff0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33000 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
33010 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
33020 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
33030 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
33040 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
33050 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
33060 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
33070 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
33080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33090 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
330a0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
330b0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
330c0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
330d0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
330e0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
330f0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
33100 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
33110 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
33120 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
33130 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
33140 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
33150 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
33160 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
33170 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
33180 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
33190 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
331a0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
331b0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
331c0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
331d0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
331e0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
331f0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
33200 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
33210 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
33220 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
33230 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
33240 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
33250 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
33260 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
33270 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
33280 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
33290 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
332a0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
332b0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
332c0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
332d0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
332e0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
332f0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
33300 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
33310 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
33320 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
33330 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
33340 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
33350 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
33360 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
33370 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
33380 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
33390 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
333a0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
333b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
333c0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
333d0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
333e0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
333f0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
33400 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
33410 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
33420 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
33430 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
33440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
33450 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
33460 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
33470 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
33480 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
33490 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
334a0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
334b0 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
334c0 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
334d0 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
334e0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
334f0 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
33500 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
33510 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
33520 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
33530 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
33540 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
33550 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
33560 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33580 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
33590 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
335a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
335b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
335c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
335d0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
335e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
335f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
33600 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
33610 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33620 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
33630 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
33640 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
33650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
33660 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
33670 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33690 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
336a0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
336b0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
336c0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
336d0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
336e0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
336f0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
33700 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
33710 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
33720 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
33730 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
33740 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
33750 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
33760 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
33770 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
33780 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
33790 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
337a0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
337b0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
337c0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
337d0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
337e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
337f0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
33800 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
33810 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
33820 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
33830 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
33840 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
33850 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
33860 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
33870 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
33880 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
33890 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
338a0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
338b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
338c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
338d0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
338e0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
338f0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33900 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
33910 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33920 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
33930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33940 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
33950 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
33960 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
33970 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
33980 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
33990 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
339a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
339b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
339c0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
339d0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
339e0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
339f0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
33a00 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
33a10 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
33a20 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
33a30 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
33a40 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
33a50 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
33a60 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
33a70 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
33a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
33a90 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
33aa0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
33ab0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
33ac0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
33ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
33ae0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
33af0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
33b00 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
33b10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
33b20 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
33b30 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
33b40 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
33b50 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
33b60 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
33b70 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
33b80 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
33b90 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
33ba0 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
33bb0 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
33bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
33bd0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
33be0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
33bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33c00 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
33c10 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
33c20 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
33c30 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
33c40 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
33c50 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
33c60 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
33c70 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
33c80 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
33c90 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33ca0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
33cb0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  pBt;.  Pgno ovfl
33cc0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
33cd0 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
33ce0 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
33cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33d00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33d10 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
33d20 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
33d30 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
33d40 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
33d50 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63   if( pInfo->nLoc
33d60 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  al==pInfo->nPayl
33d70 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  oad ){.    retur
33d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
33d90 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
33da0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
33db0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
33dc0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
33dd0 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a  Cell+pInfo->nSiz
33de0 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  e-1 > pPage->aDa
33df0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
33e00 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c  ge ){.    /* Cel
33e10 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
33e20 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
33e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33e40 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
33e50 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
33e60 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
33e70 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
33e80 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
33e90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
33ea0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
33eb0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
33ec0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
33ed0 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
33ee0 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
33ef0 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
33f00 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
33f10 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
33f20 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
33f30 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
33f40 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
33f50 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
33f60 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
33f70 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
33f80 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
33f90 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
33fa0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
33fb0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33fc0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
33fd0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
33fe0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
33ff0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
34000 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
34010 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
34020 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
34030 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
34040 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
34050 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
34060 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
34070 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
34080 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
34090 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
340a0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
340b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
340c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
340d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
340e0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
340f0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
34100 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
34110 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
34120 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
34130 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
34140 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
34150 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
34160 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
34170 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
34180 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
34190 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
341a0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
341b0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
341c0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
341d0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
341e0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
341f0 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
34200 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
34210 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
34220 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
34230 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
34240 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
34250 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
34260 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
34270 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
34280 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
34290 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
342a0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
342b0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
342c0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
342d0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
342e0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
342f0 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
34300 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
34310 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
34320 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
34330 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
34340 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
34350 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
34360 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
34370 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
34380 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
34390 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
343a0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
343b0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
343c0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
343d0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
343e0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
343f0 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
34400 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
34410 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
34420 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
34430 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
34460 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
34470 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
34480 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
34490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
344a0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
344b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
344c0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
344d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
344e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
344f0 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
34500 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
34510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34520 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
34530 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
34540 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
34550 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
34560 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
34570 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
34580 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
34590 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
345a0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
345b0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
345c0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
345d0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
345e0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
345f0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34600 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
34610 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
34620 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
34630 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
34640 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
34650 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
34660 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
34670 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
34680 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
34690 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
346a0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
346b0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
346c0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
346d0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
346e0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
346f0 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
34700 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
34710 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
34720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34730 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
34740 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34760 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
34770 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
34780 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
34790 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
347a0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
347b0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
347c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
347d0 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
347e0 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
347f0 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
34800 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
34810 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
34820 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
34830 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
34840 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
34850 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
34860 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
34870 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
34880 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
34890 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
348a0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
348b0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
348c0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
348d0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
348e0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
348f0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
34900 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34910 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
34920 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
34930 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
34940 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34950 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
34960 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
34970 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
34980 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
34990 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
349a0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
349b0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
349c0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
349d0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
349e0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
349f0 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
34a00 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
34a10 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
34a20 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
34a30 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34a50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34a60 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34a70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
34a80 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
34a90 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
34aa0 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
34ab0 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
34ac0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
34ad0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
34ae0 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
34af0 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
34b00 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
34b10 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
34b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34b30 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
34b40 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
34b50 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
34b60 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
34b70 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
34b80 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
34b90 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
34ba0 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
34bb0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
34bc0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
34bd0 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
34be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
34bf0 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
34c00 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
34c10 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
34c20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
34c30 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
34c40 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
34c50 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
34c60 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
34c70 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
34c80 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
34c90 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
34ca0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
34cb0 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
34cc0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34cd0 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
34ce0 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
34cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34d00 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
34d10 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
34d20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
34d30 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
34d40 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
34d50 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
34d60 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
34d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
34d80 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
34d90 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
34da0 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
34db0 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
34dc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
34dd0 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
34de0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
34df0 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
34e00 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34e10 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
34e20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
34e30 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
34e40 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
34e50 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
34e60 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
34e70 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
34e80 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34e90 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
34ea0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
34eb0 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
34ec0 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
34ed0 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
34ee0 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
34ef0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
34f00 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
34f10 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
34f20 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
34f30 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
34f40 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
34f50 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
34f60 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
34f70 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
34f80 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
34f90 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
34fa0 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
34fb0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34fc0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
34fd0 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
34fe0 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
34ff0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
35000 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
35010 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
35020 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
35030 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
35040 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
35050 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
35060 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
35070 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
35080 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
35090 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
350a0 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
350b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
350c0 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
350d0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
350e0 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
350f0 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
35100 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
35110 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
35120 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
35130 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
35140 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35150 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
35160 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
35170 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
35180 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
35190 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
351a0 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
351b0 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
351c0 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
351d0 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
351e0 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
351f0 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
35200 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
35210 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
35220 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
35230 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
35240 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
35250 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
35260 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
35270 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
35280 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
35290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
352a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
352b0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
352c0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
352d0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
352e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
352f0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
35300 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
35310 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
35320 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
35330 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
35340 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
35350 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
35360 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
35370 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
35380 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35390 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
353a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
353b0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
353c0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
353d0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
353e0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
353f0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
35400 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35410 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
35420 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
35430 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
35440 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
35450 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
35460 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
35470 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
35480 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
35490 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
354a0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
354b0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
354c0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
354d0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
354e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
354f0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
35500 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
35510 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
35520 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
35530 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
35540 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
35550 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
35560 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
35570 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
35580 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
35590 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
355a0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
355b0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
355c0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
355d0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
355e0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
355f0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
35600 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
35610 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
35620 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35630 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
35640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35650 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
35660 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
35670 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
35680 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
35690 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
356a0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
356b0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
356c0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
356d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
356e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
356f0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
35700 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
35710 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
35720 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
35730 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
35740 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
35750 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
35760 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
35770 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
35780 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
35790 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
357a0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
357b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
357c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
357d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
357e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
357f0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
35800 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
35810 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35820 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
35830 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35840 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
35850 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
35860 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
35870 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
35880 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
35890 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
358a0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
358b0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
358c0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
358d0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
358e0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
358f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
35900 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35910 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35920 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
35930 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
35940 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
35950 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35960 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
35970 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
35980 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
35990 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
359a0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
359b0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
359c0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
359d0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
359e0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
359f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35a00 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
35a10 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
35a20 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
35a30 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
35a40 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
35a50 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
35a60 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
35a70 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
35a80 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
35a90 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
35aa0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
35ab0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
35ac0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
35ad0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
35ae0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
35af0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35b00 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
35b10 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35b20 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
35b30 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
35b40 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
35b50 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
35b60 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
35b70 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
35b80 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
35b90 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
35ba0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
35bb0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
35bc0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
35bd0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
35be0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35bf0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35c00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
35c10 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
35c20 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
35c30 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
35c40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
35c50 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
35c60 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
35c70 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
35c80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
35c90 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
35ca0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
35cb0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
35cc0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
35cd0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
35ce0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
35cf0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a  eLeft -= n;.  }.
35d00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
35d10 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
35d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
35d30 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
35d40 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
35d50 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
35d60 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
35d70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
35d80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
35d90 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
35da0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
35db0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
35dc0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
35dd0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
35de0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
35df0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
35e00 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
35e10 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
35e20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
35e30 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
35e40 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
35e50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
35e60 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
35e70 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
35e80 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
35e90 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
35ea0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
35eb0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
35ec0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
35ed0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
35ee0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
35ef0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
35f00 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
35f10 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
35f20 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
35f30 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
35f40 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
35f50 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
35f60 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
35f70 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
35f80 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
35f90 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
35fa0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
35fb0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
35fc0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
35fd0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
35fe0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
35ff0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
36000 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
36010 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36020 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
36030 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
36040 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36050 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36060 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36080 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36090 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
360a0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
360b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
360c0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
360d0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
360e0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
360f0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
36100 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
36110 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
36120 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
36130 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
36140 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
36150 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
36160 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
36170 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
36180 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
36190 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
361a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
361b0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
361c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
361d0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
361e0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
361f0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
36200 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
36210 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
36220 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
36230 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
36240 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
36250 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
36260 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
36270 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
36280 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
36290 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
362a0 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
362b0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
362c0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
362d0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
362e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
362f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
36300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36310 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
36320 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
36330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
36340 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
36350 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
36360 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
36370 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
36380 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
36390 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
363a0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
363b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
363c0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
363d0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
363e0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
363f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
36400 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
36410 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
36420 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
36430 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
36440 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
36450 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
36460 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
36470 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
36480 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
36490 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
364a0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
364b0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
364c0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
364d0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
364e0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
364f0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
36500 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
36510 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
36520 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
36530 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
36540 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
36550 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
36560 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
36570 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
36580 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
36590 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
365a0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
365b0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
365c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20  ted..**.** *pRC 
365d0 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f  must be SQLITE_O
365e0 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K when this rout
365f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
36600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
36610 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
36620 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
36630 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
36640 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
36650 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
36660 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
36670 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
36680 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
36690 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
366a0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
366b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
366c0 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
366d0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
366e0 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
366f0 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
36700 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
36710 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
36720 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
36730 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
36740 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
36750 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
36760 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
36770 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
36780 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
36790 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
367a0 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
367b0 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
367c0 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
367d0 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
367e0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
367f0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
36800 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
36810 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
36820 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
36830 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
36840 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
36850 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
36860 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
36870 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20  /.  u8 *pIns;   
36880 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
36890 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  nt in pPage->aCe
368a0 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f  llIdx[] where no
368b0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a   cell inserted *
368c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  /..  assert( *pR
368d0 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  C==SQLITE_OK );.
368e0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
368f0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
36900 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
36910 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
36920 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
36930 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
36940 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
36950 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
36960 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
36970 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
36980 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
36990 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
369a0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
369b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
369c0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
369d0 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
369e0 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
369f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36a00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36a10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
36a20 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
36a30 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
36a40 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
36a50 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
36a60 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
36a70 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
36a80 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
36a90 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
36aa0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
36ab0 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
36ac0 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
36ad0 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
36ae0 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
36af0 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
36b00 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
36b10 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
36b20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
36b30 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
36b40 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
36b50 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
36b60 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
36b70 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
36b80 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
36b90 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
36ba0 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
36bb0 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
36bc0 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
36bd0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
36be0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
36bf0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
36c00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
36c10 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
36c20 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
36c30 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
36c40 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
36c50 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
36c60 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
36c70 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
36c80 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
36c90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
36ca0 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72  +;.    /* Compar
36cb0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72  ison against Arr
36cc0 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77  aySize-1 since w
36cd0 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20  e hold back one 
36ce0 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a  extra slot.    *
36cf0 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e  * as a contingen
36d00 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  cy.  In other wo
36d10 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20  rds, never need 
36d20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72  more than 3 over
36d30 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  flow.    ** slot
36d40 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f  s but 4 are allo
36d50 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62  cated, just to b
36d60 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61  e safe. */.    a
36d70 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79  ssert( j < Array
36d80 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
36d90 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61  fl)-1 );.    pPa
36da0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
36db0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
36dc0 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
36dd0 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
36de0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
36df0 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
36e00 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
36e10 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
36e20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
36e30 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
36e40 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
36e50 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
36e60 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
36e70 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
36e80 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
36e90 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
36ea0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
36eb0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
36ec0 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
36ed0 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
36ee0 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
36ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
36f00 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
36f10 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
36f20 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
36f30 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
36f40 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
36f50 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
36f60 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
36f70 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
36f80 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
36f90 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
36fa0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
36fb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36fc0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36fd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36ff0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
37000 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
37010 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
37020 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37030 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37040 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
37050 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
37060 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
37070 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
37080 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
37090 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
370a0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
370b0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
370c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
370d0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
370e0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
370f0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
37100 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
37110 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
37120 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
37130 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
37140 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
37150 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37160 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
37170 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
37180 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
37190 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
371a0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
371b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
371c0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
371d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
371e0 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
371f0 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
37200 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
37210 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
37220 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
37230 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
37240 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
37250 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
37260 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
37270 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
37280 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
37290 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
372a0 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
372b0 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
372c0 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
372d0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
372e0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
372f0 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
37300 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
37310 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
37320 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
37330 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
37340 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
37350 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
37360 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
37370 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
37380 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
37390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
373a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
373b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
373c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
373d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
373e0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
373f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
37400 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
37410 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
37420 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
37430 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
37440 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
37450 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
37460 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
37470 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
37480 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
37490 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
374a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
374b0 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
374c0 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
374d0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
374e0 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
374f0 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
37500 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
37510 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  ight be held on 
37520 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
37530 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
37540 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
37550 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
37560 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
37570 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
37580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37590 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
375a0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
375b0 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
375c0 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
375d0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
375e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
375f0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
37600 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
37610 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
37620 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
37630 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
37640 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
37650 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
37660 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
37670 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
37680 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
37690 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
376a0 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
376b0 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
376c0 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
376d0 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
376e0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
376f0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
37700 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
37710 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
37720 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
37730 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
37740 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
37750 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
37760 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
37770 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
37780 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
37790 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
377a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
377b0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
377c0 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
377d0 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
377e0 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
377f0 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
37800 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
37810 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
37820 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
37830 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
37840 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
37850 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
37860 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
37870 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
37880 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
37890 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
378a0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
378b0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
378c0 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
378d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
378e0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
378f0 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
37900 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
37910 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
37920 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
37930 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
37940 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
37950 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
37960 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
37970 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
37980 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
37990 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
379a0 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
379b0 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
379c0 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
379d0 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
379e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
379f0 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37a00 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
37a10 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
37a20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
37a30 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
37a40 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
37a50 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
37a60 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
37a70 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
37a80 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
37a90 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
37aa0 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
37ab0 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
37ac0 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
37ad0 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
37ae0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
37af0 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
37b00 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
37b10 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
37b20 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
37b30 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
37b40 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
37b50 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
37b60 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
37b70 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
37b80 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
37b90 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
37ba0 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
37bb0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
37bc0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
37bd0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
37be0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
37bf0 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
37c00 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
37c10 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
37c20 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
37c30 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37c40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
37c50 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
37c60 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c80 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
37c90 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
37ca0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
37cb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37cc0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37cd0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
37ce0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37d00 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
37d10 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
37d20 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
37d30 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
37d40 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
37d50 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
37d60 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
37d70 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
37d80 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
37d90 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
37da0 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
37db0 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
37dc0 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
37dd0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
37de0 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
37df0 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
37e00 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
37e10 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
37e20 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
37e30 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
37e40 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
37e50 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
37e60 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
37e70 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
37e80 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
37e90 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
37ea0 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
37eb0 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
37ec0 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
37ed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
37ee0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
37ef0 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
37f00 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
37f10 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
37f20 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20  aData,pEnd) ){. 
37f30 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
37f40 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
37f50 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
37f60 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
37f70 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
37f80 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d  ellptr, (pData -
37f90 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
37fa0 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
37fb0 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65   if( pData < pCe
37fc0 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53  llptr ) return S
37fd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37fe0 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  PT;.    memcpy(p
37ff0 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43  Data, pCell, szC
38000 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  ell[i]);.    ass
38010 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
38020 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
38030 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
38040 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
38050 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
38060 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]!=pPg->xCellS
38070 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
38080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
38090 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
380a0 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
380b0 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
380c0 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
380d0 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
380e0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
380f0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
38100 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
38110 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
38120 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
38130 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
38140 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
38150 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
38160 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
38170 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
38180 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20   0x00;.  return 
38190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
381a0 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
381b0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
381c0 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
381d0 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
381e0 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74  y szCell.** cont
381f0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
38200 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
38210 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
38220 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
38230 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20   to .** add the 
38240 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20  cells stored in 
38250 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67  the array to pag
38260 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e  e pPg. If it can
38270 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a  not (because .**
38280 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
38290 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74  to be defragment
382a0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65  ed before the ce
382b0 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e  lls will fit), n
382c0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65  on-zero.** is re
382d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
382e0 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20  e, if the cells 
382f0 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73  are added succes
38300 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a  sfully, zero is.
38310 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
38320 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c  ** Argument pCel
38330 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  lptr points to t
38340 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
38350 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
38360 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72  er array.** (par
38370 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74  t of page pPg) t
38380 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65  o populate. Afte
38390 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d  r cell apCell[0]
383a0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
383b0 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c  he.** page body,
383c0 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74   a 16-bit offset
383d0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70   is written to p
383e0 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20  Cellptr. And so 
383f0 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  on, for each.** 
38400 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
38410 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  y. It is the res
38420 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
38430 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
38440 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ure.** th